Property Animation Part I(屬性動畫 第一部分)

原文章地址在此

概述

屬性動畫系統是一個強大的動畫框架系統,幾乎可以利用它來使任何對象動起來。你可以定義一個動畫在一段時間內來指定任何對象的屬性變化,無論該對象是否在當前屏幕中出現。你可以指定某個對象的某個屬性在一段時間內發生變化。爲了使其動起來,比如改變對象在屏幕上的位置,那麼就需要指定指定這次動畫的持續時間以及具體的改變距離。

屬性動畫系統可讓您定義一個動畫過程中的以下幾點

  • 持續時間:你可以指定動畫的持續時間。默認長度爲300毫秒。

  • 時間插值:您可以指定該屬性的值來修改動畫的時間軌跡(此處翻譯的不甚理想,原文爲Time interpolation: You can specify how the values for the property are calculated as a function of the animation’s current elapsed time.)

  • 重複次數和行爲:你可以爲一個動畫指定是否重複執行,以及重複執行的次數。您還可以指定是否動畫反向執行。也可設置循環執行動畫(即正向-反向-正向的順序),直至到達重複次數。

  • 動畫集:您可以將動畫成一起執行或按照指定的延遲有序執行

  • 幀刷新延遲:您可以指定多久刷新動畫的幀。默認設置刷新每10毫秒,但在你的應用程序可以刷新幀最終取決於系統的繁忙程度和手機性能。

屬性動畫的工作原理

首先,讓我們看看一個簡單的屬性動畫原理示例。如下圖,其一個假設對象X屬性,它表示在畫面上的水平位置。動畫的持續時間被設定爲40毫秒,行進的距離是40個像素。每隔10毫秒(這是默認的幀刷新速率),這個對象水平方向移動10個像素。在40毫秒結束時,動畫停止,並且對象位於水平位置40像素處,這是一個線性時間插值動畫的例子,這意味着是一個恆定速度的物體在運動。

這裏寫圖片描述

還可以指定個具有非線性內插的動畫。下圖指定了一個開始時加速,在結束時減速的動畫對象。仍然是在40毫秒內移動了40個像素,但非勻速度。在開始的時候,這個動畫加速到中間點,然後減速,直到動畫結束。行進的距離在開始和結束小於在中間時間的距離。

這裏寫圖片描述

讓我們來仔細看一下屬性動畫是如何計算如上所示的那些動畫。下圖表示出了主要的類與其內部類是如何工作的。

這裏寫圖片描述

ValueAnimator類同動畫的時間相關聯,如動畫已經運行多長時間,以及它的動畫屬性的當前值。

ValueAnimator類封裝了TimeInterpolator類(用來定義時間插值)和TypeEvaluator類(該類定義瞭如何計算已經開始執行的動畫的值)。例如,在圖2中,TimeInterpolator類使用了 AccelerateDecelerateInterpolator(非線性時間插值)、而TypeEvaluator的類型爲IntEvaluator。

要創建一個屬性動畫,需要創建一個ValueAnimator類,並指定它的初值和終值,以及動畫的時間屬性。當你調用start()方法時動畫開始。在整個動畫過程中,ValueAnimator類會基於該動畫的持續時間和還有多少時間結束計算出一個0-1之間的值(暫時稱之爲已完成分數)。該值表示動畫已完成的百分比,0爲0%、1爲100%。例如,在圖1中,在t=10毫秒時,該值將是0.25,因爲總的持續時間爲t = 40毫秒,且圖1爲線性時間插值。

當ValueAnimator類完成計算已完成分數時,它調用預先指定的TimeInterpolator對象來計算一個內插的分數。用來同預設的時間插值相對應。例如,在圖2中,在t = 10毫秒處,因爲動畫緩慢加速時,內插的分數,約爲0.15,小於已完成分數0.25。而在圖1中,內插的分數總是同已完成分數相等。

當內插的分數的計算完成,是由ValueAnimator類調用指定TypeEvaluator基於整體位置和內插的分數來計算已執行動畫的屬性的值。例如,在圖2中,在t = 10毫秒處內插的分數爲0.15,所以當時該屬性的值爲0.15×(40 - 0),即6。

更多示例請參考com.example.android.apis.animation包中的API演示示例項目。

屬性動畫和視圖動畫的區別

視圖動畫只支持View對象來使用,所以如果你想使非View對象動起來,你必須自己通過代碼來實現該功能。視圖動畫系統也受限於只支持少量的View動畫特性。比如你可以如對一個View進行的縮放和旋轉,但無法改變其背景顏色。

視圖動畫系統的另一個缺點是,它僅修改其View繪製,而不是實際的View本身的屬性。舉例來說,如果你使一個按鈕在屏幕上移動,按鈕的繪製是正確的,但在此時按鈕的可點擊實際位置不會改變,以至於開發者要實現自己通過代碼來處理這個問題。

但是在屬性動畫系統中,這些問題已經完全不復存在,可以對任何對象(View對象和非View對象)的任何屬性來執行(並且這些屬性會真的被改變)。屬性動畫系統執行的動畫的方式也更加健壯。在更高的層次上,分配給animators 要執行動畫的屬性,如顏色,位置或大小,也可以定義動畫的方方面面,如插值和多個動畫同步。

但是視圖動畫系統,將會花費較少的時間和代碼量。如果已有的代碼已經達到你預期的效果,就沒有必要使用屬性動畫系統來替換。可以嘗試在不同的情況下使用不同的動畫系統來解決問題。

API概述

大部分的屬性動畫系統的API都位於android.animation下。因爲視圖動畫系統已經定義了許多插值android.view.animation,屬性動畫系統也可以使用。下表描述的屬性動畫系統的主要組成部分

Animators

該動畫類提供的基本結構,用於創建動畫。通常不建議直接使用這個類,因爲使用它需要你實現大量的方法。下面的是子類擴展動畫:

  • ValueAnimator 計算屬性動畫在運動時的主要時序引擎。它的所有核心功能包括了,計算動畫值和包含每個動畫的時間細節,一個動畫是否重複的信息,接收動畫更新事件的監聽器,並能夠設置自定義類型評估。有兩部分動畫屬性:計算動畫的相關數值以及把計算後的數值設定在正在動畫對象的相關屬性上。ValueAnimator無法重複得到,所以你必須通過監聽由ValueAnimator計算值更新和修改的對象的事件,來實現你自己的邏輯

  • ObjectAnimator ValueAnimator的子類,可以爲其指定一個動畫對象以及該對象的動畫屬性,該對象會隨着動畫的執行來改變動畫對象的對應屬性,由於使用該類指定一個動畫的過程更加簡單,所以通常情況下你會使用這個類來完成一個屬性動畫。但是由於ObjectAnimator的一些限制,有時還是會直接ValueAnimator類,比如需要一個特定的acessor方法的動畫對象時

  • AnimatorSet 提供了一種機制,讓單個的動畫有了組的概念。可以設置動畫同時執行,按照順序執行,或在指定的延遲後執行

Evaluators

Evaluators 告訴屬性動畫系統如何計算一個給定的屬性值。基於Animator類提供的時序數據、動畫的開始和結束值,來計算動畫屬性值。屬性動畫系統提供以下Evaluators 類:

  • IntEvaluator 爲int類型屬性準備的默認Evaluators類

  • FloatEvaluator 爲float類型屬性準備的默認Evaluators類

  • ArgbEvaluator 爲顏色屬性(十六進制值)類型屬性準備的默認Evaluators類

  • TypeEvaluator 一個允許你創建你自己的Evaluators類的接口。如果你希望對一個不是前三種屬性來執行的動畫,你就必須實現TypeEvaluator接口來指定如何計算對象屬性值的動畫。當你希望同默認的實現有所不同時,你也可以對前三種屬性來指定一個TypeEvaluator對象

Interpolators

Interpolators定義了一個同時間關聯的計算函數,通過該函數,可以得到指定時間點上對應的屬性值。例如,可以指定在整個動畫過程中線性發生動畫,即動畫在整個時間內均勻地移動,或者你可以指定要使用的非線性時,比如圖2那種運動方式的動畫。下面的類描述了在android.view.animation中包含的Interpolators類。如果沒有適合您的需要的Interpolators實現,自行實現TimeInterpolator接口即可。

  • AccelerateDecelerateInterpolator 開始和結束緩慢但加速通過中間
  • AccelerateInterpolator 慢慢加速,從慢到快
  • AnticipateInterpolator 先退後一些,然後向前
  • AnticipateOvershootInterpolator 先退後一些,然後向前 ,超過指定數值後再回退
  • BounceInterpolator 達到指定數值後反彈
  • CycleInterpolator 按照指定次數循環
  • DecelerateInterpolator 慢慢減速,從快到慢
  • LinearInterpolator 線性,變化恆定
  • OvershootInterpolator 超過指定數值後再回退
  • TimeInterpolator 自定義Interpolators需要實現的接口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章