Android动画原理分析(二)----属性动画

1、基本特点 属性动画是从Android3.0开始的动画框架,功能和扩展性都很强,可以实现补间动画所有的效果。
功能:旋转、缩放、平移、颜色渐变(ARGB)、自定义形状、自定义运动轨迹
对象:View、Layout、Activity等。Google开发文档原文是:

【Android动画原理分析(二)----属性动画】The property animation system is a robust framework that allows you to animate almost anything. You can define an animation to change any object property over time, regardless of whether it draws to the screen or not.
中文翻译:
属性动画系统是更加鲁棒的动画框架,他可以方便你为任何东西做动画,你可以在时间维度上去定义动画,不用考虑他是否画在屏幕上。
优点:功能丰富,使用灵活
缺点:有可能影响性能
实现形式:xml和java
2、实例引入 下面是一个简单的实例:
private void startRotateAnimation(View myView){ ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotation", 0, 360); animator.setDuration(1000); animator.start(); }

这里写了一个函数实现将一个view旋转360度,时间1s的动画。
3、实现原理 这一块的代码位于:
package android.animation
属性动画源码比较抽象,数据传递层次也较深,我是以上面例子为线索看的。一层层看下去基本上可以明白类之间的关系。上述例子中总共3行,其中两行很重要
3.1 ObjectAnimator 初始化
ObjectAnimator animator = ObjectAnimator.ofFloat(myView, “rotation”, 0, 360);
这一行实际上是初始化数据的过程。
Android动画原理分析(二)----属性动画
文章图片

Android动画原理分析(二)----属性动画
文章图片

这个初始化的过程就是将
ObjectAnimator.ofFloat(myView, “rotation”, 0, 360);
的参数转化到ObjectAnimator对象和其成员中,其中float… values 的长度就是Keyframe的个数,所以上述例子中只有两个KeyFrame。
3.2 动画的启动和执行
animator.start();
这一行调用就开始请求执行动画了,但是真正开始执行还要等到下一个vSync信号触发绘画。
这里建议先了解一个Android 的机制Choreographer,也可以看Android Choreographer 源码分析
我一开始没有这个概念,一通乱找浪费了不少时间。
通过了解Choreographer可以明白触发属性动画的起点是在Choreographer中。
Android动画原理分析(二)----属性动画
文章图片

属性动画的执行过程大致如上图所示,由ObjectAnimator的start的方法开始,到PropertyValuesHolder的setAnimateValue,最终通过一些native方法将改变的属性值直接可以设到Object中。
4、属性动画组合式用法
private void startAnimation(View myView) { ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f, 0.8f, 1.0f); ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f); ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360); ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400); ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "translationY", 100, 750); AnimatorSet set = new AnimatorSet(); set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim); //set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim); set.setDuration(3000); set.start(); }

5、总结 (1)这一套框架通过Choreograher和PropertyValuesHolder嵌入到UI渲染过程中,类似一个插件比较灵活,同时不好的就是或占用doFrame的时间影响渲染性能;
(2) 这个扩展性也非常强不论是各种Animator还是Evaluator或是Interpolator;
(3)代码比较抽象巧妙,关联性弱。PropertyName必须是Object的属性。

    推荐阅读