前言
Property Animation是Android3.0引入的一種功能強大的動畫系統。它除了可以給普通的View添加動畫效果外,還可以給對象添加效果。另外,Property Animation與Tween Animation一個最大的區別是Property Animation更改是對象的實際屬性,而後者只是View的繪製效果,比如一個Button實現一個移動的動畫效果,如果使用Tween Animation 的話,Button 的點擊位置並不會隨着動畫的移動效果兒移動。換句話說在新位置Button是可能沒有點擊事件的。使用Property Animation可以設置下面的一些動畫特性:
Duration: 動畫之間的間隔
Time interpolation: 屬性值的變化方式,可以表示爲動畫的事件函數,例如線性動畫,加速動畫等等。
Repeat count and behavior: 動畫的重複次數和重複方式。
Animation sets: 動畫集合
Frame refresh delay: 幀刷新間隔,默認是10ms,但具體的速度依賴於系統的繁忙程度。
屬性動畫的工作原理
圖1描繪了一個假象的對象x屬性的動畫,它給出了該對象在屏幕水平方法的位置,在40ms內改對象移動了40個像素。每10ms記錄一次對象移動的像素,這個動畫是的Time interpolation是liearinterpolation,表明動畫是以恆定的速度移動的。
在Property Animation中,ValueAnimator是其核心類,它記錄了動畫自身的一些屬性值。圖2是其工作流程:
動畫在整個過程中,會根據我們當初設置的TimeInterpolator和TypeEvaluator的計算方式計算出不通的屬性值,從而不斷的改變屬性值的大小,就會產生各式各樣的動畫效果。
下面就通過一個實例理解一下什麼是TimeInterpolator和TypeEvaluator.
- TimeInterpolator
TimeInterpolator翻譯過來是插值器,插值器定義了動畫變化中的屬性變化規則,它根據時間比例因子計算出一個插值因子,那麼什麼是時間比例因子呢,簡單講就是:
時間比例因子 = 動畫已執行的時間 / 動畫執行的總時間
而插值因子,用於設定動畫是線性變化,還是非線性變化等千萬中變化,你可以通過實現TimeInterpolator來實現自己的插值器(在>sdk22可以繼承抽象類BaseInterpolator)。Android中默認的定義很多的插值器:
AccelerateDecelerateInterpolator
在開始和結束時速度較慢
AccelerateInterpolator
加速變化
LinearInterpolator
勻速變化
更多的插值器,可以在這裏查看.
//自定義插值器
class MyInterpolator implements TimeInterpolator{
@Override
public float getInterpolation(float input) {
//自定義的規則
return 0;
}
}
- TypeEvaluator
TypeEvaluator是根據插值因子去計算屬性值,Android默認可以識別的類型爲int, float和顏色,分別是
IntEvalutor, FloatEvalutor, ArgbEvaluator.
IntEvalutor
計算整數型
FloatEvalutor
計算浮點型
ArgbEvaluator
計算顏色屬性
//自定義TypeEvaluator
class MyTypeEvaluator implements TypeEvaluator<Ball>{
@Override
public Ball evaluate(float fraction, Ball startValue, Ball endValue) {
//自己的規則
return null;
}
}
下面以三個小球的旋轉效果爲例,瞭解一下屬性動畫的整個實現過程。
源碼可以看這裏