推薦相關好的文章 : 講解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的具體屬性上,就完成了動畫過程。
回到開篇的小學數學題 , 那就是動畫的實質。