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
的时候,才是减速的,否则就不是减速的。
其实,AccelerateInterpolator
和DecelerateInterpolator
都可以通过传入不同都参数达到加速或者减速都效果的。