按照官網上的介紹,屬性動畫框架是一個可以讓任何“內容”動畫化的框架,它可以讓你通過在指定時間內修改對象的“屬性值”來達到動畫化的效果(比如View的scaleX,translationX等屬性)。它不同于視圖動畫的一點是他更加靈活,之前提供的視圖動畫(android.view.animation包)修改的對象僅僅是視圖相關的內容,修改的對象只能是View,且僅僅局限于平移,縮放,透明度,旋轉及它們的組合;而屬性動畫框架中,修改的對象則是object,也就是說,不只是view,activity,fragment乃至任何繼承Object的對象中定義過的值理論上都可以被修改,而且修改完成之后,是真正的,切切實實的修改。
對于源碼的分析,通常要帶著一些問題進行分析,這樣在解惑的同時也會對源碼有一個很好的認識,首先我們使用屬性動畫的時候,大概是下面這么個樣子:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// 屬性動畫示例1
ObjectAnimator animator = ObjectAnimator.ofFloat(this, "test", 0.8f, 1.0f);
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(1000);
animator.setRepeatCount(3);
animator.start();
}
public void setTest(float value) {
imageView.setAlpha(value);
imageView.setScaleX(value);
}
}
示例1實現的是在1000毫秒內分別將imageView的alpha屬性以及scaleX屬性從80%到100%進行變化;以上代碼也可以寫為以下形式:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// 屬性動畫示例2
PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 0.8f, 1.0f);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 0.8f, 1.0f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv_one, holder1, holder2);
//屬性動畫的估值器,可以讓我們對值的變化進行更細致的計算
animator.setEvaluator(new TypeEvaluator<Float>() {
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
Log.v("tag", "this is" + startValue + " " + endValue);
return startValue + fraction * (endValue - startValue);
}
});
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(1000);
animator.setRepeatCount(3);
animator.start();
}
}
示例2和示例1實現的功能相同,我們平常在使用屬性動畫時,通常會考慮到以下幾個維度:
- 改誰:我們會傳遞一個對象作為要修改的屬性,比如示例1中的MainActivity,示例2的imageView
- 改什么屬性:要提供給動畫框架我們要修改對象的哪個屬性,通過提供屬性的名字就可以檢索到相關屬性的set值(比如示例1的test屬性),這是如何做到的?請看后面源碼分析
- 改的屬性的變化范圍:我們通常要給定修改屬性的變化范圍,比如從0到1,相應的范圍就會產生變化,從而達到屬性修改產生動畫的效果。
- 時間:屬性變化從起始值到最終值的時間
- 動畫執行次數(repeatCount)
- 插值器(Interpolator)用于度量屬性動畫改變的比率(fraction)在當前時刻的值,不同的插值器在同一時刻通過計算得到的比率可能是不同的。
- 估值器 (Evaluator) 通過得到的比率,通過不同的計算方式返回當前應該得到的屬性值
- 集合(PropertyViewHolder)有時我們可能會修改多個屬性(也可以說是執行多個動畫),我們通過設置AnimatorSet(多個對象)或者PropertyViewHolder(同一個對象)來達到這一目的
??屬性動畫框架給我們提供的這些動畫框架可以讓我們很方便的實現動畫的炫酷效果(當然,View的繪制在這里還是起了主要作用),那么這么多的內容是如何串聯起來的?我們就從示例1開始一步一步開始對源碼進行分析吧。
其他部分的鏈接:
[Android屬性動畫源碼分析(二)]
[Android屬性動畫源碼分析(三)]
[Android屬性動畫源碼分析(四)]