天天看點

淺談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 的實作原理