推荐相关好的文章 : 讲解ValueAnimator 和Interpolator的文章
动画就是 当前时间点 与 当前时间点上对应的View的属性值 (例如:平移动画) 那就是当前时间点上 view对应的位置
就像 小学数学题 一辆汽车 从A地到B地 100km 规定了1小时到达, 那么整个过程就像是一个平移动画, 动画就是 当前时间点 小车到了哪里?
1、我们设置动画的时候会设置 时间 就是设定动画运行多长时间 duration 例如是1000ms setDuration()
2、设置 开始位置 和 结束位置 例如:开始是100 到 结束值300
动画开始到当前动画经过了 time时长 例如300ms
3、时间因子 t = time / duration ; 那么就得到了 0---1范围的值
4、将时间因子 传给 Interpolator 让他加工这个时间因子 , 使时间因子 不再是单调的线性 (这也是Interpolator的作用)
例如LinearInterpolator 它就是直接返回了 时间因子 因为他就是线性的
再例如BounceInterpolator 弹撞的效果 它就是如下代码 :
public float getInterpolation(float t) {
// _b(t) = t * t * 8
// bs(t) = _b(t) for t < 0.3535
// bs(t) = _b(t - 0.54719) + 0.7 for t < 0.7408
// bs(t) = _b(t - 0.8526) + 0.9 for t < 0.9644
// bs(t) = _b(t - 1.0435) + 0.95 for t <= 1.0
// b(t) = bs(t * 1.1226)
t *= 1.1226f;
if (t < 0.3535f) return bounce(t);
else if (t < 0.7408f) return bounce(t - 0.54719f) + 0.7f;
else if (t < 0.9644f) return bounce(t - 0.8526f) + 0.9f;
else return bounce(t - 1.0435f) + 0.95f;
}
上面代码就是对时间因子做了 一些计算,使它不再是线性的
5、 将Interpolator的 返回值 传给ValueAnimator的 evaluate方法 他将 对应的时间 返回对应的 实际的值
public float evaluate(float fraction, Character startValue, Character endValue) {
float curValue= startInt + fraction *(endValue- startValue));
return curValue;
}
6、最后 将实际的值 传给 ObjectAnimator 它将这些值 设置到view的具体属性上,就完成了动画过程。
回到开篇的小学数学题 , 那就是动画的实质。