天天看点

浅谈android Animation Animator 的实现原理

推荐相关好的文章  : 讲解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的具体属性上,就完成了动画过程。

回到开篇的小学数学题  , 那就是动画的实质。

浅谈android Animation Animator 的实现原理