说到属性动画,就绕不开估值器(TypeEvaluator)与插值器(Interpolator),下边咱就说说这两个:
TypeEvaluator(估值器):
定义:设置 属性值 从初始值过渡到结束值 的变化具体数值
- 插值器(
Interpolator
)决定 值 的变化规律(匀速、加速blabla),即决定的是变化趋势;而接下来的具体变化数值则交给估值器 - 属性动画特有的属性
- 协助插值器(Interpolator)实现非线性动画效果
其实,对于 ValueAnimator.ofInt() 、 ValueAnimator.ofFloat() 、ValueAnimator.ofArgb()这三个,系统是自带了三个估值器,分别是IntEvaluator 、FloatEvaluator 、ArgbEvaluator .
但是对于ValueAnimator.ofObject() 以及 ObjectAnmitor 就需要手动传入估值器,当然也可以使用系统自带的三个估值器。既然说到这里了,肯定也就能自定义估值器,下边咱先看一下FloatEvaluator 源码吧:
public class FloatEvaluator implements TypeEvaluator {
// FloatEvaluator实现了TypeEvaluator接口
// 重写evaluate()
public Object evaluate(float fraction, Object startValue, Object endValue) {
// 参数说明
// fraction:表示动画完成度(根据它来计算当前动画的值)
//fraction 就是插值器返回过来的百分比数值
// startValue、endValue:动画的初始值和结束值
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
// 初始值 过渡 到结束值 的算法是:
// 1. 用结束值减去初始值,算出它们之间的差值
// 2. 用上述差值乘以fraction系数
// 3. 再加上初始值,就得到当前动画的值
}
}
- 但对于
ValueAnimator.ofObject()
,从上面的工作原理可以看出并没有系统默认实现,因为对对象的动画操作复杂 & 多样,系统无法知道如何从初始对象过度到结束对象 - 因此,对于
ValueAnimator.ofObject()和
ObjectAnmitor ,我们需自定义估值器(TypeEvaluator
)来告知系统如何进行从 初始对象 过渡到 结束对象的逻辑 - 自定义实现的逻辑如下<