Property Animation是谷歌在Android3.0的时候引入的,这个动画改变的是对象的实际属性,在视图动画(View Animation)中,改变的只是视图绘制的位置,而不是实际视图本身。
Property Animation允许我们定义动画的下列特征
Duration:动画的持续时间,默认为300ms。
Time interpolation:时间插值,如何根据动画当前经过的时间计算属性值。
Repeat count and behavior:重复的次数和行为,指定动画在持续时间结束时是否重复播放,以及重复播放的方式,如顺序播放还是倒序播放。
Animator sets:动画的集合,这些动画集合可以一起播放,顺序播放或在指定延迟后播放。
Frame refresh delay:帧的刷新时间,默认为10ms。最终取决于硬件环境和当前系统状态。
Property Animation是如何工作的?
上图表示了一个线性插值的动画实例。它用x属性表示在屏幕上的水平位置,动画的持续时间设置为40ms,移动距离为40像素。每10ms,即默认的刷新速率,对象水平移动10个像素。在40ms的末尾,动画停止。并且动画停留在水平40像素的位置。
ValueAnimator
ValueAnimator 即表示一个动画,包含了要动画的属性的起始值和结束值,以及动画的持续时间。
ValueAnimator 封装了一个TimeInterpolator,它定义了动画的插值方法。ValueAnimator还封装了一个TypeEvaluator,它定义了如何计算正在动画的属性的值。在整个动画过程中,ValueAnimator会根据动画的持续时间和已经过去的时间计算出一个时间因子。如上图中t=10ms时,时间因子为10ms / 40ms = 0.25。在计算出时间因子后会调用TimeInterpolator的值计算出插值因子。上图中插值因子总是与时间因子相同。在计算出插值因子后,ValueAnimator会调用适当的TypeEvaluator,根据动画的插值因子,动画的起始值和结束值计算出正在动画的属性值,在上图中t=10ms时插值因子为0.25,因此此时的改属性值为0.25 * (40-0) = 10。
可以通过ValueAnimator.ofXXX的静态方法来创建一个ValueAniamtor对象,这些ValueAnimator分别对不同的数据类型来进行动画,包括下面5种:
ofInt(),ofFloat(),ofArgb(),ofObject(),ofPropertyValuesHolder()。它们分别为Int类型的数据,Float类型的数据,颜色类型十六进制数据,自定义类型的数据,PropertyValuesHolder类型的数据进行动画。
一个属性动画包括两部分,计算动画值和正在动画的对象和属性上设置这些值。ValueAnimator只完成了第一部分,想要完成第二部分,必须实现Animator.AnimatorUpdateListener接口。
ValueAnimator.ofFloat(0f, 1f).apply {
duration = 1000
addUpdateListener { animation ->
Float animatedValue = animation.animatedValue as Float
Log.d("TAG", "currentValue is $animatedValue");
}
start()
}
上面中代码只是在Log中输入了一些信息,可以改为自己想做的工作。在ofFloat()方法中可以传入多个参数。这些参数的时间间隔均匀分布。下面的代码中表示在1秒钟内从0到