Android动画(三)之插值器和估值器
TimerInterpolator
中文翻译为时间插值器,它的作用是根据时间的流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator
(线性插值器:匀速动画)、AccelerateDecelerateInterpolator
(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator
(减速插值器:动画越来越慢)等。
TypeEvaluator
的中文翻译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator
(针对整型属性)、FloatEvaluator
(针对浮点型数据)和ArgbEvaluator
(针对Color属性)。
属性动画中的插值器(Interpolator
)和估值器(TypeEvalutor
)很重要,它们是实现非匀速动画的重要手段,下面通过一个实例来加强理解。
如下图所示,它表示一个匀速动画,采用了线性插值器和整型估值算法,在40ms
内,View
的x
属性实现从0
到40
的变换。
由于动画的默认刷新率为10ms/帧
,所以该动画将分5
帧进行,我们来考虑第三帧(x=20,t=20ms
),当时间t=20ms
时,时间流逝的百分比 是0.5
(20/40=0.5
),意味着现在时间过了一半,那么x
的值就应该由插值器和估值算法来确定。拿线性插值器来说,当时间过了一半,x
的变换也应该是一半,因为它实现的是匀速动画,下面是它的源码:
@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
}
public LinearInterpolator(Context context, AttributeSet attrs) {
}
public float getInterpolation(float input) {
return input;
}
/** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createLinearInterpolator();
}
}
很显然,线性插值器的返回值和输入值一样,因此插值器返回的值是0.5
,这意味着x
的改变就是0.5
,这个时候插值器的工作就完成了。具体x
变成了什么值,这个需要估值算法来确定,下面是估值算法的源码:
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
}
上述算法很简单,evaluate
的三个参数分别表示估值小数、开始值和结束值,对应于上面的例子就分别是0.5
、0
、4
。根据上述算法,整形估值返回给我们的结果是20
,这就是(x=20,t=20ms
)的由来。
属性动画要求对象的该属性有set
方法和get
方法(可选)。插值器和估值算法除了系统提供的外,我们还可以自定义。实现方式也很简单,因为插值器和估值算法都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口就可以了,然后就可以做出千奇百怪的动画效果了。具体一点就是:自定义插值器需要实现Interpolator
或者TimeInterpolator
,自定义估值算法需要实现TypeEvaluator
。另外就是如果要对其他类型(非int
,float
,Color
)做动画,那么必须要自定义类型估值算法。