一、概念
TimeInterpolator:时间插值器,根据时间流逝的百分比来计算出当前属性值改变的百分比。
系统预置的有:
LinearInterpolator(@android:anim/linear_interpolator,线性插值器,匀速动画)
AccelerateDecelerateInterpolator(@android:anim/accelerate_decelerate_interpolator,加速减速插值器,动画两头慢中间快)
AccelerateInterpolator(@android:anim/accelerate_interpolator,加速插值器,动画越来越快)
DecelerateInterpolator(@android:anim/decelerate_interpolator,减速插值器,动画越来越慢)
AnticipateInterpolator(@android:anim/anticipate_interpolator,动画开始的时候先向后,然后向前滑动)
AnticipateOvershootInterpolator(@android:anim/anticipate_overshoot_interpolator,动画开始的时候先向后,然后向前滑动,结束的时候向前甩一定值后返回最后的值)
OverShootInterpolator(@android:anim/overshoot_interpolator,动画向前滑动,结束的时候向前甩一定值后返回最后的值)
BounceInterpolator(@android:anim/bounce_interpolator,动画结束的时候弹起)
CycleInterpolator(@android:anim/cycle_interpolator,动画循环播放特定的次数,速度的改变遵循正弦曲线)
TypeEvaluator:估值器,根据当前属性改变的百分比来计算改变后的属性值。
系统预置的有:
IntEvaluator(针对整型属性)
FloatEvaluator(针对浮动型属性)
ArgbEvaluator(针对Color属性)
属性动画中的插值器和估值器很重要,它们是实现非匀速动画的重要手段。
二、源码分析
线性插值器LinearInterpolator源码如下:
public class LinearInterpolator implements Interpolator {
public LinearInterpolator() {
}
public LinearInterpolator(Context context, AttributeSet attrs) {
}
public float getInterpolation(float input) {
return input;
}
}
对线性插值器来说,时间流逝的百分比跟当前属性值改变的百分比是一样的,因此插值器返回的值是input。
整型估值器IntEvaluator源码如下:
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
return (int)(startValue + fraction * (endValue - startValue));
}
}
返回值等于起始值加上改变值。
三、自定义
插值器和估值器都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口,然后就可以做出千奇百怪的动画效果。
自定义插值器需要实现Interpolator或者TimeInterpolator;
自定义估值器需要实现TypeEvaluator。
另外,如果要对其它类型(非int、float、Color)做动画,那么必须自定义估值器。