Interpolator:撺改者,校对机,分类机,插补器
Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等,这使得基本的动画得以实现加速、减速等效果。
Interpolator 接口只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。

Android 提供了几个 Interpolator 的实现类,实现了不同的速度曲线,如下:
  • AccelerateDecelerateInterpolator     在动画开始与结束的地方速率改变比较慢,在中间的时候加速【慢-快-慢】
  • AccelerateInterpolator     在动画开始的地方速率改变比较慢,然后开始加速【慢-快】(Accelerate 加速)
  • AnticipateInterpolator     开始的时候向后然后向前甩
  • AnticipateOvershootInterpolator    开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator 动画结束的时候弹起
  • CycleInterpolator(float cycles)     动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator     在动画开始的地方快然后慢【快-慢】(Decelerate,减速)
  • LinearInterpolator     动画以均匀的速率改变
  • OvershootInterpolator 向前甩一定值后再回到原来位置
相同的东西,另一种描述:
  • AccelerateInterpolator         加速,开始时慢中间加速
  • DecelerateInterpolator         减速,开始时快然后减速
  • AccelerateDecelerateInterolator    先加速后减速,开始结束时慢,中间加速
  • AnticipateInterpolator       反向 ,先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator    反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
  • BounceInterpolator         跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
  • CycleIinterpolator            循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
  • LinearInterpolator           线性,线性均匀改变
  • OvershottInterpolator        回弹,最后超出目的值然后缓慢改变到目的值
  • TimeInterpolator           一个接口,允许你自定义interpolator,以上几个都是实现了这个接口
XML文件里有相应的几个可以设置的属性
          Interpolator 插值器-LMLPHP     Interpolator 插值器-LMLPHP
在代码中使用:animation.setInterpolator(new *Interpolator());
在布局中使用:android:interpolator="@android:anim/*_interpolator" 

注意:
  • 以上效果不能叠加,若先后设置了两个,则仅后面设置的效果有效。
  • 在Property Animation中的TimeInterplator,和View Animation中的Interplator,是一样的东西,在3.0之前只有Interplator,3.0之后实现代码转移至了TimeInterplator,Interplator继承自TimeInterplator,内部没有任何其他代码。
如果android定义的interpolators不符合你的效果,也可以自定义interpolators,实现抛物线、自由落体等物理效果。

AccelerateInterpolator的源码:
   mFactor = factor;//构造方法中出入的参数,默认为1
   mDoubleFactor = 2 * mFactor; 
    public float getInterpolation(float input) {
        if (mFactor == 1.0f) {
            return input * input;
        } else {
            return (float)Math.pow(input, mDoubleFactor);
        }
    }  
    如果factor=1 则函数为x^2(默认),否则函数为x^a (a 是参数)
    注意:下图表示的是位移-时间曲线,切线表示的是速度(并非加速度)
    Interpolator 插值器-LMLPHP

AccelerateDecelerateInterpolator的源码:
     public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }  
    Interpolator 插值器-LMLPHP
    Interpolator 插值器-LMLPHP
从图可以看到,先从0开始加速,中间值速度最大,之后开始减速,速度减到0时刚好到达结束位置。

class MyInterpolator implements Interpolator {
        private float mFactor;
        private int i;
        public MyInterpolator(int i) {//初始化时设定速率变化规则
            this.i = i;
        }
        @Override
        public float getInterpolation(float input) {
            //参数input是一个0.0f~1.0f的浮点数,Interpolator可认为是一个基于input构造出的函数
            switch (i) {
            case 2://“变化率”呈二次方
                mFactor = input * input;
                break;
            case 3://“变化率”呈三次方
                mFactor = input * input * input;
                break;
            default://“变化率”是匀速的
                mFactor = input;
                break;
            }
            return mFactor;
        }
    }
}

04-17 23:14