一時間插值器(TimeInterpolator)的作用是根據時間流逝的百分比計算出動畫進度的百分比。
public class LinearInterpolator implements Interpolator{ @Override public float getInterpolation(float v) { return v; } }如線性插值器,輸入v則返回v.(項目總時間過了40%,則項目進度也達到了40%)
二。類型估值器(TypeEvaluator)的作用是根據屬性值改變的百分比計算出改變後的屬性值。
public class IntEvaluator implements TypeEvaluator<Integer>{
public Integer evaluate(float fraction,Integer startValue,Integer endValue){
int startInt = startValue;
return (int)(startInt + fracion * (endValue - startValue));
}
}
屬性動畫通過以上兩類就可以完成輸入當前時間計算出當前屬性最終值得計算。
三。屬性動畫ObjectAnimator的start方法中,
首先判斷當前動畫,等待動畫,延遲動畫中是否有和當前動畫相同的動畫,有就把該相同動畫取消。接着調用父類ValueAnimator的start方法
在ValueAnimator的start方法中要使用handler,所以要保證運行在有 Looper的線程中
它會調用一個run方法和底層交互,並調用ValueAnimator的doAnimationFrame方法。
doAnimationFrame中會根據不同的狀態返回或計算當前的時間作爲參數調用animateValue方法
animateValue會調用calulateValue方法計算每幀動畫對應的屬性值,
最後會以反射的方式調用set方法對對象的屬性進行設置
如果屬性的初始值沒有設置,則get方法會被調用,在PropertyValuesHolder的setupValue中。
動畫下一幀到來時,set方法被調用,PropertyValuesHolder的setAnimatedValue中。
四。對象可以對其任何屬性使用屬性動畫,但要保證該對象具有該屬性的set和get方法,並且set方法會以某種方式最終影響到該對象的UI。
1.當對象不具有set,get屬性時,可以用類包裝該類,使其間接具有get和set方法
//包裝View類 用於給屬性動畫調用 從而包裝了set get
public class ViewWrapper {
private View target;
public ViewWrapper(View target) {
this.target = target;
}
public int getWidth() {
return target.getLayoutParams().width;
}
public void setWidth(int width) {
target.getLayoutParams().width = width;
target.requestLayout();
}
}
//使用:
ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(mButton,"width",500).setDuration(3000).start();
二採用ValueAnimator,監聽動畫過程,自己實現屬性變化
ValueAnimator可以自己產生值,但要給其設定初始值,結束值,以及週期,就可以讓它開始運作
然後通過監聽,在其產生每一個值時人工改變對象的屬性值。
private void performAnimate(final View target, final int start, final int end) {
ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
// 持有一個IntEvaluator對象,方便下面估值的時候使用
private IntEvaluator mEvaluator = new IntEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
// 獲得當前動畫的進度值,整型,1-100之間
int currentValue = (Integer) animator.getAnimatedValue();
Log.d(TAG, "current value: " + currentValue);
// 獲得當前進度佔整個動畫過程的比例,浮點型,0-1之間
float fraction = animator.getAnimatedFraction();
// 直接調用整型估值器通過比例計算出寬度,然後再設給Button
target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);
target.requestLayout();
}
});
valueAnimator.setDuration(5000).start();
}
三。最簡單的還是給該對象該屬性增加set和get方法,如果可以的話
參考:Android開放藝術探索