Open alwaystest opened 7 years ago
标签(空格分隔): Android Transition Animator
好多App都使用了SharedElementTransition来处理页面跳转,两个页面之间平滑过渡效果还是很漂亮的。
看了好多讲使用TransitionManager来开启动画的文章,其中讲TransitionManager.beginDelayedTransition的时候,说到:
TransitionManager.beginDelayedTransition
在下一次绘制时,系统会自动对比之前保存的视图树,然后执行一步动画。
怎么样就是在下一次绘制时呢?万一下次绘制的时候对View的操作没有执行完呢?其实有点想多了,Android的绘制屏幕和对UI的更改只能在主线程,对View的修改操作没有完成,当然是不可能运行到绘制阶段的呀。
Android transitions 如何工作讲的很清楚:
TransitionManager通过添加一个OnPreDrawListener来等待下一个渲染帧code
另一个常用来控制动画的是Animator。
Animator
初学者自己定义动画的时候可能会递归调用handler.postDelayed修改某个属性,造成动画的假象,这样是不合适的,一个是时间不好控制,另一个是流畅性不好保证。
handler.postDelayed
这个时候可以使用ValueAnimator来进行动画控制。
ValueAnimator
ValueAnimator添加了一个AnimatorUpdateListener:
AnimatorUpdateListener
This method is called on all listeners for every frame of the animation
这个每一帧就不是使用ViewTreeObserver.OnPreDrawListener来回调的了。而是涉及到Choreographer这个类。
ViewTreeObserver.OnPreDrawListener
Choreographer
通过Choreographer.getInstance().postFrameCallback(new FPSFrameCallback()); 把你的回调添加到Choreographer之中,那么在下一个frame被渲染的时候就会回调你的callback,执行你定义的doFrame操作,这时候你就可以获取到这一帧的开始渲染时间并做一些自己想做的事情了。 Android Choreographer 源码分析
在使用ValueAnimator.ofFloat的时候,偶然发现每次animation.getAnimatedValue调用的时候,都会自动装箱返回一个Float类型的对象,在连续多次使用Animator动画之后很容易生成许多临时对象,导致GC,如果GC阻塞主线程时间过长,会影响应用流畅性。推测其他类型的Animator动画应该也会产生临时对象。
ValueAnimator.ofFloat
animation.getAnimatedValue
动画虽好看,也不宜过度使用啊。
Android 动画
标签(空格分隔): Android Transition Animator
好多App都使用了SharedElementTransition来处理页面跳转,两个页面之间平滑过渡效果还是很漂亮的。
看了好多讲使用TransitionManager来开启动画的文章,其中讲
TransitionManager.beginDelayedTransition
的时候,说到:怎么样就是在下一次绘制时呢?
万一下次绘制的时候对View的操作没有执行完呢?其实有点想多了,Android的绘制屏幕和对UI的更改只能在主线程,对View的修改操作没有完成,当然是不可能运行到绘制阶段的呀。Android transitions 如何工作讲的很清楚:
另一个常用来控制动画的是
Animator
。初学者自己定义动画的时候可能会递归调用
handler.postDelayed
修改某个属性,造成动画的假象,这样是不合适的,一个是时间不好控制,另一个是流畅性不好保证。这个时候可以使用
ValueAnimator
来进行动画控制。ValueAnimator
添加了一个AnimatorUpdateListener
:这个每一帧就不是使用
ViewTreeObserver.OnPreDrawListener
来回调的了。而是涉及到Choreographer
这个类。在使用
ValueAnimator.ofFloat
的时候,偶然发现每次animation.getAnimatedValue
调用的时候,都会自动装箱返回一个Float类型的对象,在连续多次使用Animator动画之后很容易生成许多临时对象,导致GC,如果GC阻塞主线程时间过长,会影响应用流畅性。推测其他类型的Animator动画应该也会产生临时对象。动画虽好看,也不宜过度使用啊。