alwaystest / Blog

24 stars 2 forks source link

Android 动画 #53

Open alwaystest opened 7 years ago

alwaystest commented 7 years ago

Android 动画

标签(空格分隔): Android Transition Animator


好多App都使用了SharedElementTransition来处理页面跳转,两个页面之间平滑过渡效果还是很漂亮的。

看了好多讲使用TransitionManager来开启动画的文章,其中讲TransitionManager.beginDelayedTransition的时候,说到:

在下一次绘制时,系统会自动对比之前保存的视图树,然后执行一步动画。

怎么样就是在下一次绘制时呢?万一下次绘制的时候对View的操作没有执行完呢?其实有点想多了,Android的绘制屏幕和对UI的更改只能在主线程,对View的修改操作没有完成,当然是不可能运行到绘制阶段的呀。

Android transitions 如何工作讲的很清楚:

TransitionManager通过添加一个OnPreDrawListener来等待下一个渲染帧code


另一个常用来控制动画的是Animator

初学者自己定义动画的时候可能会递归调用handler.postDelayed修改某个属性,造成动画的假象,这样是不合适的,一个是时间不好控制,另一个是流畅性不好保证。

这个时候可以使用ValueAnimator来进行动画控制。

ValueAnimator添加了一个AnimatorUpdateListener

This method is called on all listeners for every frame of the animation

这个每一帧就不是使用ViewTreeObserver.OnPreDrawListener来回调的了。而是涉及到Choreographer这个类。

通过Choreographer.getInstance().postFrameCallback(new FPSFrameCallback()); 把你的回调添加到Choreographer之中,那么在下一个frame被渲染的时候就会回调你的callback,执行你定义的doFrame操作,这时候你就可以获取到这一帧的开始渲染时间并做一些自己想做的事情了。 Android Choreographer 源码分析

在使用ValueAnimator.ofFloat的时候,偶然发现每次animation.getAnimatedValue调用的时候,都会自动装箱返回一个Float类型的对象,在连续多次使用Animator动画之后很容易生成许多临时对象,导致GC,如果GC阻塞主线程时间过长,会影响应用流畅性。推测其他类型的Animator动画应该也会产生临时对象。

动画虽好看,也不宜过度使用啊。