# 介绍

Interpolator 本质上是一个数学函数，其取数字在0.0和1.0之间，并将其转换为另一个数字。

# 原理

public interface TimeInterpolator {
/**
* Maps a value representing the elapsed fraction of an animation to a value that represents
* the interpolated fraction. This interpolated value is then multiplied by the change in
* value of an animation to derive the animated value at the current elapsed animation time.
*
* @param input A value between 0 and 1.0 indicating our current point
*        in the animation where 0 represents the start and 1.0 represents
*        the end
* @return The interpolation value. This value can be more than 1.0 for
*         interpolators which overshoot their targets, or less than 0 for
*         interpolators that undershoot their targets.
*/
float getInterpolation(float input);
}

@HasNativeInterpolator
public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
private final float mFactor;
private final double mDoubleFactor;

public AccelerateInterpolator() {
mFactor = 1.0f;
mDoubleFactor = 2.0;
}

/**
* Constructor
*/
public AccelerateInterpolator(float factor) {
mFactor = factor;
mDoubleFactor = 2 * mFactor;
}

public AccelerateInterpolator(Context context, AttributeSet attrs) {
this(context.getResources(), context.getTheme(), attrs);
}

public float getInterpolation(float t) {
if (mFactor == 1.0f) {
return t * t;
} else {
return (float)Math.pow(t, mDoubleFactor);
}
}
}

y=t2f

t：就是时间索引，通过比例的转换为0-1之间的值，即3000m或者5000ms，在运动随着时间的流逝，通过比例都转换为0-1的取值；

y：就是Interpolator的输出，根据时间的流逝的百分比，计算出动画属性改变的百分比，或者是说动画总路程的百分比。

f ：相当于代码中的mFactor，指定加速度应该如何强调的因素 ，可以通过构造函数自定义该值，这里默认是1。这里的 f 越大，起始速度越慢，但是后期加速度会更大；如果 f=0.5，则和LinearInterpolator的行为一模一样了。

# 分类

java类 xml资源id 说明
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 其变化开始和结束速率较慢，中间加速
AccelerateInterpolator @android:anim/accelerate_interpolator 其变化开始速率较慢，后面加速
DecelerateInterpolator @android:anim/decelerate_interpolator 其变化开始速率较快，后面减速
LinearInterpolator @android:anim/linear_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 循环播放，其速率为正弦曲线
TimeInterpolator   一个接口，可以自定义插值器

## 1.Linear Interpolator 线性插值

## 2. Accelerate Interpolator / 加速度插值器

名称: f

XML属性: android:factor

描述: 加速度参数. f越大，起始速度越慢，但是速度越来越快

## 3. Decelerate Interpolator / 减速插值器

名称: f

XML属性: android:factor

描述: 加速度参数.  f越大，起始速度越快，但是速度越来越慢

## 4. Accelerate Decelerate Interpolator / 先加速后减速插值器

## 5. Anticipate Interpolator

名称: T

XML属性: android:tension

描述: 张力值, 默认为2，T越大，初始的偏移越大，而且速度越快

## 6. Overshoot Interpolator

名称: T

XML属性: android:tension

描述: 张力值，默认为2，T越大，结束时的偏移越大，而且速度越快

该插值器的y值就是先会超过1，然后又回到1。

## 7.Anticipate Overshoot Interpolator

public AnticipateOvershootInterpolator(float tension)

public AnticipateOvershootInterpolator(float tension, float extraTension)

XML属性: android:tension

描述: 张力值，默认为2，张力越大，起始和结束时的偏移越大，而且速度越快

XML属性: android:extraTension

描述: 额外张力值，默认为1.5。

公式中T的值为tension*extraTension

## 8. Bounce Interpolator / 弹跳插值器

## 9.Cycle Interpolator / 周期插值器

名称: C

XML属性: android:cycles

描述: 周期值，默认为1；2表示动画会执行两次

这里的动画是放大效果，那么就会先放大->缩小 -> 放大 ->恢复原来

# 使用

## 在xml使用

<scale
android:duration="2000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0"/>

<?xml version="1.0" encoding="utf-8"?>
<accelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:factor="2">
</accelerateInterpolator>

## 在java是使用

animation.setInterpolator(new AccelerateInterpolator());

animation.setInterpolator(new AccelerateInterpolator(2));

animation.setInterpolator(AnimationUtils.loadInterpolator(this,R.anim.my_accelerate_interpolator));

# 自定义Interpolators

public class HesitateInterpolator implements Interpolator {

public HesitateInterpolator() {}

@Override
public float getInterpolation(float input) {
float x = 2.0f * input - 1.0f;
return 0.5f * (x * x * x + 1.0f);
}
}

java类 说明
FastOutLinearInInterpolator 其变化先加速然后匀速，本质还是加速运动，和Accelerate  Interpolator类似
LinearOutSlowInInterpolator 其变化先匀速再减速，和Decelerate Interpolator类似
FastOutSlowInInterpolator 其变化是先加速，然后减速，和Accelerate Decelerate Interpolator类似