一、评估程序简介
在 Android 属性动画(一)新手入门 中就已经介绍了属性动画的类型评估程序(TypeEvaluator)是用于定义在动画中如何计算添加了动画效果的属性的值,即属性值跟时间之间的关系(随着时间如何变化)。插值器会接收来自 Animator 的已播放时间分数,插值器会根据已播放时间分数计算出插值分数,评估程序根据这个插值分数计算出属当前性值。Android系统已经定义了可识别类型的评估程序,分别是 IntEvaluator
、FloatEvaluator
和 ArgbEvaluator
,分别对应 int
、float
、颜色(argb)
类型数据。如果需要添加动画效果的属性类型不是这些,那么就需要自定义类型评估程序,计算属性值了。
二、如何自定义类型评估程序
自定义类型评估程序,只需要实现 TypeEvaluator
接口,这个接口类中只有 evaluate()
一个方法需要实现。在此方法中实现如何计算动画在当前点的属性值,并将值返回。下面是 FloatEvaluator
类实现的代码:
FloatEvaluator
public class FloatEvaluator implements TypeEvaluator<Number> {
public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}
}
说明:当
ValueAnimator
(或ObjectAnimator
)运行时,它会计算动画当前的已完成动画分数(一个介于 0 和 1 之间的值),当前的插值器会根据这个动画分数计算出一个插值分数,类型评估程序(TypeEvaluator
)通过fraction
参数接收这个插值分数,根据这个插值分数计算出属性的当前值。
在前面文章的示例中,对一个视图同时进行X、Y缩放的时候,如果X、Y缩放比例不一致,使用 FloatEvaluator
就无法直接实现了,只能通过 AnimatorSet
来实现。如果自定义 TypeEvaluator
,再结合 ValueAnimator
可以不通过 AnimatorSet
就实现同时对视图X、Y实现不同比例的缩放。
- 定义评估程序
XYEvaluator
class XYEvaluate : TypeEvaluator<PointF> {
override fun evaluate(fraction: Float, startValue: PointF, endValue: PointF): PointF {
val x = startValue.x + fraction * (endValue.x - startValue.x)
val y = startValue.y + fraction * (endValue.y - startValue.y)
return PointF(x, y)
}
}
- 在动画中使用自定义的评估程序
ValueAnimator.ofObject(XYEvaluate(), PointF(1.0f, 1.0f), PointF(1.5f, 2.0f)).apply {
duration = 1000
repeatMode = ValueAnimator.REVERSE
repeatCount = ValueAnimator.INFINITE
addUpdateListener {
val value = it.animatedValue as PointF
imageView.scaleX = value.x
imageView.scaleY = value.y
}
start()
}
- 效果
注意事项:如果自定义的评估程序使用了不是属性值的类型或者同时需要修改多个属性值,那么 Animator 就无法自动更新属性值(即使是用
ObjectAnimator
),所以自定义评估程序一般都会结合ValueAnimator
使用,然后在ValueAnimator.AnimatorUpdateListener
监听中更新属性值。