上一篇文章中我们分析了属性动画的工作原理,这篇文章开始介绍属性动画的实现,就不会再去分析原理,如果对原理不清楚的朋友可以看一下 Android属性动画-Property Animation(一) 原理分析
使用属性动画时我们通常使用Animator的两个子类,ValueAnimator和ObjectAnimator。这两个子类如何选择呢?在大多数情况下我们会使用ObjectAnimator,它比较轻量级,使用非常简单,但是它也有一些局限性,就是必须要实现属性的getter和setter方法,因为使用ValueAnimator的时候我们必须实现ValueAnimator.AnimatorUpdateListener接口,并且在onAnimationUpdate()里面手动更新属性值,而ObjectAnimator不用,那么他就必须要通过setter方法自动给属性赋值,getter方法自动获得属性的值。
因为ObjectAnimator使用的比较多,使用起来又比较简单,我们就先来分析一下ObjectAnimator怎么使用吧
其实ObjectAnimator是ValueAnimator的一个子类,既然google这样设计,那么它肯定进行了某方面的优化,我们上面已经提到了,使用ObjectAnimator不用再去实现ValueAnimator.AnimatorUpdateListener接口了,因为他会自动去更新属性值。
我们先来看一个简单的例子:
我们看上面代码中的“scaleY”,这是怎么来的呢?不是说ObjectAnimator需要给属性设置setter/getter方法吗?我们也没设置啊,怎么也可以执行?
带着这些疑问我们一步一步去分析一下,首先执行动画的是一个Button,Button是继承自TextView的,TextView是继承自View的。我们到View中去看一看。
果然,在View中已经写好了scaleY的setter和getter方法,不用我们自己去写了。除此之外,View中还已经写好了setAlpha()、setX()、setScaleX()、setTranslationX()等setter方法和对应的getter方法,我们可以拿来就用,其实这些不就是View Animation中的淡入淡出,平移,放大缩小等动画吗!
Note:如果将第24行注释掉,执行第25行。我们发现后面只有一个参数3.0f,属性的初始值没有了,照样可以执行!ObjectAnimator可以自动调用getter方法,获得当前属性的值,这就是为什么一定要有getter方法!如果将24、25行都注释掉,执行第26行,那就该报错了,因为View中没有一个"scaley"这个属性,只有"scaleY"。大小写非常重要!具体命名规则见下例
但是作为属性动画,号称是可以改变任意一个属性的,那么我们就来自定义一个属性,看看属性动画的威力!
首先我们自定义一个布局,它继承自View,目的就是画出一个数字在屏幕上
最后的效果:
怎么样,属性动画很厉害吧。这可是View Animation做不了的!
ObjectAnimator我们就分析完了,下一篇我们来分析ValueAnimator Android属性动画-Property Animation(三) 使用ValueAnimator完成动画