OvershootInterpolator

OvershootInterpolator的源码如下:

package android.view.animation;

public class OvershootInterpolator extends BaseInterpolator {

    private final float mTension;

    public OvershootInterpolator() {
        mTension = 2.0f;
    }

    public OvershootInterpolator(float tension) {
        mTension = tension;
    }

    public float getInterpolation(float t) {
        t -= 1.0f;
        return t * t * ((mTension + 1) * t + mTension) + 1.0f;
    }
}

float getInterpolation(float input)的实现,可以知道,这个可以用数学函数表达为y=(x-1)^2*((n+1)*(x-1)+n)+1,x∈[0,1],n∈[-∞,+∞],n是常数

Matlab的命令窗口中输入如下命令:

x = linspace(0,1,100);
y = (x - 1).*(x - 1).*(3.*(x - 1) + 2) + 1;
plot(x, y);
title('y=(x-1)^2*(3(x-1) + 2) + 1');
grid on

得到下面的曲线图:

改变上面的n,得到下面的曲线图:

从图中可以看出,当构造参数传入的等于0的时候,就是加速的,当参数大于0的时候,会超过预期值,但会被拉回来,最终停在预期值,就像橡皮筋一样。