我们先来了解属性动画的下列特征(以及对应的调用方法):
动画持续时间(Duration):动画的持续时间,默认为300ms。
setDuration(long duration)
时间插值(Time interpolation):时间插值会将时间点作为参数计算对象的属性值。就是说它提供一个方法将时间的流逝转化为属性的变化(动画时间与属性值得函数、映射关系)。
setInterpolator(TimeInterpolator value)
重复次数与重复行为(Repeat count and behavior):设置动画的重复次数,默认值为0,播放完就结束。如果重复次数大于0,就会在重复播放动画,并且会根据重复行为进行动画重播,可以从头开始播,也可以从尾开始倒着播放。
setRepeatCount(int value)和setRepeatMode(int value)
帧刷新延迟(Frame refresh delay):帧刷新的频率,默认是每10ms刷新一帧。但是这个速度最终取决于系统的响应速度。
setFrameDelay(long frameDelay)
假设有一个对象,它有一个属性x,这个对象进行一个持续40ms的线性动画。如图,随着时间t的变化,属性x值的也发生变化,而且这个变化是线性的(对应函数:x=t)。
x | t (ms) |
---|---|
0 | 0 |
20 | 20 |
30 | 30 |
40 | 40 |
那么,如果这个属性x表示在屏幕中的横向坐标的话,那个这个动画会是这样的:在40ms内对象在屏幕上水平横向匀速移动(如图,对应的时间点和位置)。
还是一样的假设。但是这里例子中时间和属性x值的关系不是一个线性变化,而是一个先加速到中间然后从中间减速的变化。(AccelerateDecelerateInterpolator,有兴趣可以看这个插值器的实现)
上图是主要类(ValueAnimator)和其他类是如何一起工作的。
ValueAnimator这个类包含:
ValueAnimator将(由内部AnimationHandler进行的)时间变化通过TimeInterpolator、TypeEvaluator转变为属性变化,通过AnimatorUpdateListener通知给对象,对象再调用getAnimatedValue获取当前变化后属性。