淺談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的具體屬性上,就完成了動畫過程。


回到開篇的小學數學題  , 那就是動畫的實質。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章