属性动画是如何工作的?

来源:互联网 发布:锦尚中国源码论坛 编辑:程序博客网 时间:2024/05/16 06:53

首先,让我们以一个简单的实例来复习一下属性动画是如何工作的。表1描叙了一个假想的情形,一个对象以他的x属性来定义他的动画,该属性描叙了该对象在屏幕上水平方向上的位置。动画的持续时间设置为了40,动画的移动距离设置为了40pixels.每10ms,也即物体默认的刷新频率,物体水平方向上移动10pixels.在40ms的末尾,动画停止,并且物体停止在该位置(与原位置偏移40pixels).这个例子中动画的查补值是线性的,代表该物体以常速移动。


你也可以以非线性插值来描叙一个动画。表2描叙的就是这种情况。物体开始时的动画是加速的,在结束时的动画是减速的。物体还是在40ms内移动了40pixels,但是是非线性的。在开始,物体以加速的方式移动到中点,然后从中点以减速的方式移动到动画结束。就如图2所示,动画在开始移动的距离小于其在中点时移动的距离(相同时间内)


以我们上面描叙的为例,让我们详细看一下组成属性系统的各个类是如何来计算动画的,表3描叙了属性动画的主要类


ValueAnimator类是一个跟动画时间相关的的类,如动画已经运行了多久了,动画的当前属性值等等。
ValueAnimator类包含了一个 TimeInterpolator的成员。TimeInterpolator定义了动画的时间插补值。ValueAnimator还包含一个TypeEvaluator,这个类定义了如何计算动画的当前属性值。例如在表2中,TimeInterpolator是 AccelerateDecelerateInterpolator(加速的),TypeEvaluator是IntEvaluator.
要启动一个动画,创建一个ValueAnimator对象并且设置该动画的起始值,以及动画的持续时间。当调用它的start方法是,动画启动。在动画的播放过程中,ValueAnimator计算已经过去的fraction ,该值在0和1之间,该值是基于动画的持续时间和动画已经消耗的时间计算出来的。已经消耗的fraction 代表这动画已经完成的百分比。0代表0%,1代表100%。例如。在表1中,在t=10ms的时候,消耗的fraction是0.25,因为总的持续时间是40ms.
当fraction的计算完成了,ValueAnimator 调用合适的TypeEvaluator来计算动画的属性值,该值的计算是基于前面得出的fraction,以及动画的起始值和结束值。例如,在表2中,在10sm的时间,fraction 的值是0.15,所以这个时候的属性值是0.15*(40-0)或者6
 API Demos例子中的com.example.andnimation工程有很多实例来介绍如何使用属性动画。
0 0
原创粉丝点击