1. 程式人生 > >android動畫詳解二 屬性動畫原理

android動畫詳解二 屬性動畫原理

    property動畫是一個強大的框架,它幾乎能使你動畫任何東西。你可以定義一個動畫來改變物件的任何屬性,不論其是否被繪製於螢幕之上。一個屬性動畫在一定時間內多次改變一個屬性(物件的一個欄位)的值。要動畫某個東西,你需指定物件的目標屬性,比如位置,動畫的持續時間,和改變的值的範圍。

屬性動畫系統允許你指定以下動畫屬性:

· Duration: 動畫持續時間。預設是300 ms. 

· Time interpolation: 你可以指定一個函式來定義如何跟據當前的時間計算屬性的值。 

· 重複次數和行為: 你可以指定是否當動畫結束時重新開始以及重複的次數。你還是可以指定是否讓動畫倒著播放。設定動畫倒著播放使得動畫先正播再倒播這樣反覆進行,直到到達所限制的重複次數。 

· 動畫集: 你可以將多個動畫在邏輯上放到一個組中一起播放或依次播放或按指定的延遲時間播放。 

· Frame refresh delay: 你可以指定動畫的幀重新整理頻率。預設是設定為10 ms,但是你的應用能重新整理幀的實際速度最終決定於系統的忙碌程度和系統執行後臺程式碼的速度。 

· 屬性動畫如何工作

    首先,我們用一個例子來大體瞭解一下一個動畫如何工作。下圖描述了某個物件要動畫其x屬性,這代表它的橫向位置。動畫持續時間被設定為40 ms並且其動畫距離被設定為40 畫素。每10 ms移動10畫素。在40ms後,動畫停止,物件停在了40的位置上。這是一個使用線性插值的物件,表示物件勻速移動。


圖 1. 線性動畫的例子

    你也可以使用非線性插值的動畫。下圖演示了一個開始加速,最後減速的動畫。物件還是在40秒內移動40畫素,但是是非線性的。開始加速到半路然後減速直到最後。就像下圖所示,開始和結束時移動的距離比中間移動的距離短。



圖 2. 非線性動畫的例子

    讓我們仔細看一下屬性動畫系統是如何計算上圖所示的動畫的重要部分的。下圖演示了主要類之間如何相互操作。


Figure 3. 動畫是如何計算的

 物件保持追蹤動畫的時間,比如動畫已運行了多長時間,以及屬性的當前值。

    要開始一個動畫,需建立一個ValueAnimator 然後告訴它所要動畫的屬性的開始和結束的值,還有動畫持續的時間。當你呼叫start() 時,動畫就開始了。在動畫進行期間,

ValueAnimator 跟據動畫的持續時間和已經過的時間,計算出一個表示進度的比例的分數(0和1之間),進度分數代表了動畫已進行的時間的百分比,0代表0%,1代表100%。例如,圖1中進度分數 在t = 10 ms時值為.25,因為總時間是t = 40 ms。

    當ValueAnimator 計算完成一個進度分數,它就呼叫TimeInterpolator 去計算一個插值分數。插入分數結合所設定的時間插值把進度分數對映到一個新的分數。例如,在圖2中,因為動畫緩慢加速,在 t = 10 ms時,插值分數為.15,小於進度分數為.25。在圖1中,插值分數進度分數永遠相等。

    當計算插值函式時,ValueAnimator 會呼叫適當的TypeEvaluator來基於插值函式、開始值、結束值計算你在動畫的屬性的值。例如,在圖2中,插值函式值在 t = 10 ms時為.15 ,所以些時屬性的值將是.15 X (40 - 0),或6。


希望對你們有所幫助!