Android 动画实现原理
最近在Android上做了一些动画效果,网上查了一些资料,有各种各样的使用方式,于是乘热打铁,想具体分析一下动画是如何实现的,Animation, Animator都有哪些区别等等。
首先说Animation(android.view.animation.Animation)对象。
无论是用纯java代码构建Animation对象,还是通过xml文件定义Animation,其实最终的结果都是
Animation a = new AlphaAnimation();Animation b = new ScaleAnimation();Animation c = new RotateAnimation();Animation d = new TranslateAnimation();
分别是透明度,缩放,旋转,位移四种动画效果。
而我们使用的时候,一般是用这样的形式:
View.startAnimation(a);
那么就来看看View中的startAnimation()方法。
1.View.startAnimation(Animation)
先是调用View.setAnimation(Animation)方法给自己设置一个Animation对象,这个对象是View类中的一个名为mCurrentAnimation的成员变量。
然后它调用invalidate()来重绘自己。
我想,既然setAnimation()了,那么它要用的时候,肯定要getAnimation(),找到这个方法在哪里调用就好了。于是通过搜索,在View.draw(Canvas, ViewGroup, long)方法中发现了它的调用,代码片段如下:
2.View.draw(Canvas, ViewGroup, long)
其中调用了View.drawAnimation()方法。
3.View.drawAnimation(ViewGroup, long, Animation, boolean)
代码片段如下:
其中调用了Animation.getTransformation()方法。
4.Animation.getTransformation(long, Transformation, float)
该方法直接调用了两个参数Animation.getTransformation()方法。
5.Animation.getTransformation(long, Transformation)
该方法先将参数currentTime处理成一个float表示当前动画进度,比如说,一个2000ms的动画,已经执行了1000ms了,那么进度就是0.5或者说50%。
然后将进度值传入插值器(Interpolator)得到新的进度值,前者是均匀的,随着时间是一个直线的线性关系,而通过插值器计算后得到的是一个曲线的关系。
然后将新的进度值和Transformation对象传入applyTranformation()方法中。
6.Animation.applyTransformation(float, Transformation)
Animation的applyTransformation()方法是空实现,具体实现它的是Animation的四个子类,而该方法正是真正的处理动画变化的过程。分别看下四个子类的applyTransformation()的实现。
ScaleAnimation
AlphaAnimation
RotateAnimation
TranslateAnimation
可见applyTransformation()方法就是动画具体的实现,系统会以一个比较高的频率来调用这个方法,一般情况下60FPS,是一个非常流畅的画面了,也就是16ms,为了验证这一点,我在applyTransformation方法中加入计算时间间隔并打印的代码进行验证,代码如下:
最终得到的log如下图所示:
右侧是“手动”计算出来的时间差,有一定的波动,但大致上是16-17ms的样子,左侧是日志打印的时间,时间非常规则的相差20ms。
于是,根据以上的结果,可以得出以下内容:
1.首先证明了一点,Animation.applyTransformation()方法,是动画具体的调用方法,我们可以覆写这个方法,快速的制作自己的动画。
2.另一点,为什么是16ms左右调用这个方法呢?是谁来控制这个频率的?
对于以上的疑问,我有两个猜测:
1.系统自己以postDelayed(this, 16)的形式调用的这个方法。具体的写法,请参考《使用线程实现视图平滑滚动》
2.系统一个死循环疯狂的调用,运行一系列方法走到这个位置的间隔刚好是16ms左右,如果主线程卡了,这个间隔就变长了。
更多相关文章
- Android官方使低版本系统(2.1)支持ActionBar的方法
- Android4.0.3 修改 启动 动画
- Androi与html中的JavaScript之间方法相互调用
- Android动画原理分析
- Android Activity切换动画效果的修改
- 【Android】Android中Button的OnClickListener实现方法
- Android webview中定制js的alert,confirm和prompt对话框的方法 (
- Android 性能优化的一些方法(转)
- Android ListView Animation 4种动画效果(贴上了GIF图)