property动画是一个强大的框架,它几乎能使你动画任何东西。你可以定义一个动画来改变对象的任何属性,不论其是否被绘制于屏幕之上。一个属性动画在一定时间内多次改变一个属性(对象的一个字段)的值。要动画某个东西,你需指定对象的目标属性,比如位置,动画的持续时间,和改变的值的范围。

 

属性动画系统允许你指定以下动画属性:

· Duration: 动画持续时间。默认是300 ms. 

· Time interpolation: 你可以指定一个函数来定义如何跟据当前的时间计算属性的值。 

· 重复次数和行为: 你可以指定是否当动画结束时重新开始以及重复的次数。你还是可以指定是否让动画倒着播放。设置动画倒着播放使得动画先正播再倒播这样反复进行,直到到达所限制的重复次数。 

· 动画集: 你可以将多个动画在逻辑上放到一个组中一起播放或依次播放或按指定的延迟时间播放。 

· Frame refresh delay: 你可以指定动画的帧刷新频率。默认是设置为10 ms,但是你的应用能刷新帧的实际速度最终决定于系统的忙碌程度和系统执行后台代码的速度。 

· 属性动画如何工作

属性,这代表它的横向位置。动画持续时间被设置为40 ms并且其动画距离被设置为40 像素。每10 ms移动10像素。在40ms后,动画停止,对象停在了40的位置上。这是一个使用线性插值的对象,表示对象匀速移动。

图 1. 线性动画的例子

    你也可以使用非线性插值的动画。下图演示了一个开始加速,最后减速的动画。对象还是在40秒内移动40像素,但是是非线性的。开始加速到半路然后减速直到最后。就像下图所示,开始和结束时移动的距离比中间移动的距离短。



图 2. 非线性动画的例子

    让我们仔细看一下属性动画系统是如何计算上图所示的动画的重要部分的。下图演示了主要类之间如何相互操作。



Figure 3. 动画是如何计算的

    ValueAnimator

    ValueAnimator 封装了一个TimeInterpolator, 它定义了动画插值算法,还封装了一个TypeEvaluator,它定义了如何去计算属性的值。例如,在图2中,使用的TimeInterpolator是 AccelerateDecelerateInterpolator 并且使用的TypeEvaluator 是IntEvaluator.

    要开始一个动画,需创建一个ValueAnimator 然后告诉它所要动画的属性的开始和结束的值,还有动画持续的时间。当你调用start() 时,动画就开始了。在动画进行期间,ValueAnimator 跟据动画的持续时间和已经过的时间,计算出一个表示进度的比例的分数(0和1之间),进度分数代表了动画已进行的时间的百分比,0代表0%,1代表100%。例如,图1中进度分数 在t = 10 ms时值为.25,因为总时间是t = 40 ms。

    当ValueAnimator 计算完成一个进度分数,它就调用TimeInterpolator 去计算一个插值分数。插入分数结合所设置的时间插值把进度分数映射到一个新的分数。例如,在图2中,因为动画缓慢加速,在 t = 10 ms时,插值分数为.15,小于进度分数为.25。在图1中,插值分数进度分数永远相等。

    当计算插值函数时,ValueAnimator 会调用适当的TypeEvaluator来基于插值函数、开始值、结束值计算你在动画的属性的值。例如,在图2中,插值函数值在 t = 10 ms时为.15 ,所以些时属性的值将是.15 X (40 - 0),或6。