参考资料:
http://www.lightskystreet.com/categories/Android/Android%E5%8A%A8%E7%94%BB/
只为做个记录:代码下载
关键代码:
import android.animation.TimeInterpolator;
/**
* Created by baiyuanwei on 16/12/29.
* 动画过程1:0 -> 1;
* 动画过程2: 1 -> 0.7 -> 1;
* 动画过程3: 1 -> 0.9 -> 1;
*/
public class MenuInterpolator implements TimeInterpolator {
private final float ROTATION_TIME = 0.4f;
private final float FIRST_BOUNCE_TIME = 0.3f;
private final float SECOND_BOUNCE_TIME = 0.3f;
@Override
public float getInterpolation(float v) {
//动画过程1:0 -> 1;
if (v < ROTATION_TIME) {
return rotationValue(v);
}
//动画过程2: 1 -> 0.7 -> 1;
else if (v < ROTATION_TIME + FIRST_BOUNCE_TIME) {
return firstBounceValue(v);
}
//动画过程3: 1 -> 0.9 -> 1;
else {
return secondBounceValue(v);
}
}
private float rotationValue(float v) {
//6.25 = 1/ROTATION_TIME^2,点(0.4,1)、(0,0)
return 6.25f * v * v;
}
private float firstBounceValue(float v) {
//二次方程求解,点(0.4,1)、(0.7,1)、(0.55,0.7)
return 13.333f * v * v - 14.6663f * v + 4.7332325f;
}
private float secondBounceValue(float v) {
//二次方程求解,点(0.7,1)、(0.85,0.9)、(1,1)
return 4.444f * v * v - 7.5548f * v + 4.11079f;
}
}
备注:
1、插值器的意义:就是当要执行input的时间时,通过Interpolator计算返回另外一个时间点,让系统执行另外一个时间的动画效果。
2、插值器中的函数方程式都是通过数学方法计算出来的,如案例中的一元二次方程式,都是通过两个点的坐标计算出来的;当然也可以是二元三次方程式。
3、输入的范围是[0,1], 输出的范围可以超过1,也可以小于0;
4、android 也自带了一些插值器:加速、减速、先加后减等。