动画 -- 属性动画 -- 插值器和估值器

一、概念

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 {
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        return (int)(startValue + fraction * (endValue - startValue)); 
    }
}

返回值等于起始值加上改变值。

三、自定义

插值器和估值器都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口,然后就可以做出千奇百怪的动画效果。
自定义插值器需要实现Interpolator或者TimeInterpolator;
自定义估值器需要实现TypeEvaluator。
另外,如果要对其它类型(非int、float、Color)做动画,那么必须自定义估值器。

你可能感兴趣的:(动画 -- 属性动画 -- 插值器和估值器)