DecelerateInterpolator

DecelerateInterpolator的源码如下:

package android.view.animation;

public class DecelerateInterpolator extends BaseInterpolator {

    private float mFactor = 1.0f;

    public DecelerateInterpolator() { }

    public DecelerateInterpolator(float factor) {
        mFactor = factor;
    }

    public float getInterpolation(float input) {
        float result;
        if (mFactor == 1.0f) {
            result = (float)(1.0f - (1.0f - input) * (1.0f - input));
        } else {
            result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));
        }
        return result;
    }
}

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

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

grid on;
x = linspace(0,1,100);

plot(x,1-(1-x).^2);
text(0.4,0.65,'y=1-(1-x)^2');
hold on;

plot(x,1-(1-x).^4);
text(0.3,0.8,'y=1-(1-x)^4');
hold on;

plot(x,1-(1-x).^8);
text(0.2,0.9,'y=1-(1-x)^8')

得到下面的曲线图:

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

grid on;
x = linspace(0,1,100);

plot(x,1-(1-x).^0.2);
text(0.75,0.3,'y=1-(1-x)^(0.2)');
hold on;

plot(x,1-(1-x).^0.4);
text(0.7,0.45,'y=1-(1-x)^(0.4)');
hold on;

plot(x,1-(1-x).^0.8);
text(0.6,0.6,'y=1-(1-x)^(0.8)')

得到下面的曲线图:

从上面的函数图可以看出,当DecelerateInterpolator构造方法传入的参数大于0.5的时候,才是减速的,否则就不是减速的。

其实,AccelerateInterpolatorDecelerateInterpolator都可以通过传入不同都参数达到加速或者减速都效果的。