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