AndroidAPI指南中文版-属性动画

属性动画系统是一个允许你让任何事物产生动画效果的强大框架。不管一个对象是不是在画在屏幕上,你都能定义一个动画去随时改变对象的属性。一个属性动画改变一个属性值(对象的一个字段)在特定的时间点。要想产生动画效果,首先你要指定一个对象的属性,比如对象在屏幕上的位置,动画的时间长短和动画的中间值。

你能使用属性动画系统定义如下的几点:

  • Duration(持续时间):你可以指定动画持续时间。默认长度是300ms。
  • Time interpolation(时间插值):你可以通过一个动画进行时间的函数来计算得到的值来作为属性值。
  • 重复次数和行为:当动画到达持续时间的结尾时,你可以指定它是否要进行重复播放和重复的次数。你也可以指定动画是否要进行倒序播放。设置这个来反复播放动画直到播放完你指定的重复次数。
  • Animator sets(动画集):你能对动画进行编组让其进行同时播放或者按顺序播放或者延时播放。
  • 帧刷新延迟:你能指定动画帧的刷新频率。默认的刷新频率是10ms,但是这个速度最终取决于系统总体上的忙碌程度和系统服务底层计时器的速度。

属性动画的工作原理

首先,我们先通过一个简单的例子来复习一下动画的工作原理。图像1描述了一个以X属性进行动画的假象对象,这个X属性表示它在屏幕上的水平位置。这个动画的持续时间是40ms,运动距离是40px。这个对象每10ms(默认的刷新率)移动10个像素。到了40ms结束的时候,此时动画停止,对象停留在水平方向为40的位置。这是一个使用线性插值器的动画例子,意味着对象会匀速移动。

图1. 线性动画示例

你也能定义使用非线性插值器的动画。图2描述了一个在动画开始时加速,在动画结束时减速的假象对象。这个对象依然在40ms内移动了40px,但是不是线性的。在动画开始时,对象先加速移动到中点,然后从中点开始减速移动知道动画结束。正如图2所示,在开始和结束时的移动距离比中点时的移动距离短。

图2.非线性动画示例

让我们来详细看看属性动画的重要组件如何像上面所说的对象一样执行动画。图3描述了主要的类如何和其他类协同工作。


图3.动画的执行过程

ValueAnimator会跟踪你的动画的时间,比如动画执行的进度,当前时刻动画的属性值等等。

ValueAnimator封装了一个决定动画插值的TimeInterpolator,还封装了一个决定动画属性值计算方式的TypeEvaluator。举个例子,在图2中,TimeInterpolator是指AccelerateDecelerateInterpolatorTypeEvaluator是指IntEvaluator

要想开始一段动画,需要创建一个ValueAnimator并且给你想要添加动画效果的属性赋予开始和结束值以及动画的持续时间。动画在你调用start())方法时开始,在整个动画执行期间,ValueAnimator根据动画的持续时间和当前进度计算一个0-1之间的消失点。这个消失点代表动画的完成的时间百分比,0表0%,1表示100%。举个例子,在图1中,t = 10ms时的消失点为0.25因为总长度为t = 40ms。
ValueAnimator计算完消失点,它就会调用当前设置的TimeInterpolator去计算插值点。一个插值点结合当前设置的时间插值将消失点映射到新的时间点。举个例子,在图2中,

如果您觉得这篇文章不错,可以打赏支持下哦,谢谢