Android動畫效果屬性--Property Animation使用

屬性動畫系統是一個健壯 的框架,它幾乎能夠容許把任何對象變成動畫。能夠根據時間的推移來改變任何對象的屬性來定義一個動畫,而不用關心該對象是否要繪製在屏幕上。屬性動畫是在 指定的時間長度上改變一個屬性(對象中的一個成員字段)的值。要讓某些對象變成動畫,就要給該對象指定想要的動畫屬性,若是對象在屏幕上的位置、動畫的停 留時間以及動畫之間的值等。html

屬性動畫系統能夠定義如下動畫特性:android

1. 持續時間(Duration):指定動畫的持續時間。默認長度是300毫秒。api

2. 時間插值(Time interpolation):這個值可以作爲計算當前動畫運行時間的函數的屬性值來指定,它決定動畫的變化頻率。架構

3. 重複次數和行爲(Repeat count and behavior)框架

這個屬性可以指定在動畫結束時是否從新播放動畫,以及重複播放的次數。還可以指定動畫是否可以反向回播,若是設置了反向回播,那麼動畫就會先向前再向後,重複播放,直到達到播放次數。ide

4. 動畫集合(Animator sets):你可以把動畫組織到一個邏輯集合中,而後或者同時、或者順序的、或者延遲播放它們。函數

5. 幀刷新延遲(Frame refresh delay):你可以指定動畫幀的刷新頻率。默認是每10秒中刷新一次,可是應用程序最終的刷新幀的速度依賴與系統的繁忙程度以及系統可以提供的底層定時器的反應速度。性能

屬性動畫是如何工做的 動畫

首先,讓咱們用一個簡單 的例子來看一下動畫的工做方式。圖1繪製了一個假想的動畫對象,它用x屬性來表示其在屏幕上的水平位置。動畫的持續時間被設置爲40毫秒,而且移動的距離 是40個像素。每10毫秒,是默認的幀刷新頻率,即每10毫秒對象水平移動10個像素。在40毫秒結束時,動畫中止,而且動畫要停留在水平40像素點的位 置上。這是一個線性插值的動畫示例,意味着動畫勻速運動。ui

Android動畫效果屬性

圖1.線性動畫示例

還能夠指定非線性差值的 動畫。圖2假設了一個加速開始、減速結束的動畫對象,該對象依然在40毫秒內移動了40個像素,可是非線性的。在開始的時候,這個動畫加速運動到一半的位 置,而後開始減速運動直到動畫結束。如圖2所示,對象運行的距離在開始和結束階段要比中間部分短。

Android動畫效果屬性

圖2.非線性動畫的示例

接下來讓咱們更詳細的瞭解屬性動畫系統的重要組件是如何計算上圖所示動畫。圖3繪製了主類和其餘類是如何一塊兒工做的。

Android動畫效果屬性

圖3.動畫的計算方式

ValueAnimator對象保持着動畫的時間軌跡,如動畫的運行時間,以及動畫屬性的當前值。

ValueAnimator 類封裝了一個TimeInterpolator類,這個類定義了動畫的差值,和一個TypeEvaluator類,這個類定義動畫屬性值的計算方式。例 如,在圖2中TimeInterpolator對象使用AccelerateDecelerateInterpolator定 義,TypeEvaluator使用了IntEvaluator定義。

要啓動一個動畫,就要創 建一個ValueAnimator對象,而且要給該對象設置想要的動畫的屬性的開始和結束值,以及動畫的持續時間。在調用start()方法開始動畫的時 候,整個動畫期間,ValueAnimator對象會根據動畫的持續時間和已經執行的時間,在0和1之間,計算一個elapsed fraction(過去係數)。這個係數表明了動畫已經完成的百分比,0意味着0%、1意味着100%。例如,圖1中,在t = 10毫秒處的過去係數是0.25,由於總的持續時間是t = 40毫秒。

當 ValueAnimator對象完成過去係數的計算時,它會調用當前設置的TimeInterpolator對象,來計算一個差值係數 (interpolated fraction)。差值係數(interpolated fraction)把過去係數(elapsed fraction)映射到一個新的考慮設置時間差值的係數。例如,在圖2中,由於動畫是慢慢的加速,所以在t=10毫秒時,差值係數大約是0.15,它比 過去係數(elapsed fraction)0.25要小。在圖1中,差值係數(interpolated fraction)與過去係數(elapsed fraction)始終相同。

在計算差值係數 (interpolated fraction)時,ValueAnimator對象會調用相應的TypeEvaluator對象,基於差值係數、動畫的開始值、結束值,來計算動畫的 屬性值。例如,在圖2中,在t = 10毫秒處,差值係數是0.15,所以在此時的屬性值應該是0.15*(40 – 0)= 6。

在API Demos示例工程中的com.example.android.apis.animation包,提供了不少如何使用屬性動畫系統的例子。(http://developer.android.com/tools/samples/index.html)

屬性動畫與視圖動畫的差別

視圖動畫提供了只讓View對象具備動畫效果的能力,所以想要非View對象具備動畫效果,就得本身實現動畫效果的代碼。事實上,視圖動畫系統也受到了限制,它只會把不多的View對象的特徵暴露給動畫效果,如例如,View對象的縮放和旋轉,可是沒有背景色,等等。

視圖動畫的另外一個缺點是,它僅可以在繪製View對象時被修改,而且不是實際的View對象自己。例如,若是要讓一個按鈕,以動畫的形式穿越屏幕,按鈕正確的繪製了,可是點擊按鈕的實際位置卻不會改變,所以必須本身來實現這種處理邏輯。

在屬性動畫系統中,這些 如今被完全刪除,而且可以讓任何對象的任何屬性具備動畫效果(View對象和非View對象),而且可以實際修改對象自身。屬性動畫在動畫執行方面也更加 健壯。在高層次上,能夠給想要動畫效果的屬性分配動畫執行器,如顏色、位置、尺寸以及可以定義的動畫特性(如插值和多個動畫的同步等)。

可是,視圖動畫系統須要較少的建立時間和編寫較少的代碼。若是視圖動畫可以知足需求,或者既存的代碼已經作了想要完成的動畫效果,就不須要使用屬性動畫效果了。針對不一樣的狀況來選擇使用這兩種不一樣的動畫系統。

API概要

在android.animation包中可以找大多數屬性動畫系統的API。由於視圖動畫系統已經在android.view.animation包中定義了不少插值,所以在屬性動畫系統中也可以使用這些插值。下列表格中介紹了屬性動畫系統的主要組件。

Animator類提供了建立動畫的基本架構。一般不會直接使用這個類,由於它只提供了基本功能,所以要徹底的支持動畫值就必須擴展這個類,下表列出了Animator的子類。

表1.Animators

說明

ValueAnimator

用於計算處理動畫屬性值 的主要屬性動畫時序引擎。它有全部的計算動畫值的核心功能,幷包含了每一個動畫的時序細節、動畫是否重複的信息、監聽接收更新事件和設置評估定製類型的能 力。有兩類動畫屬性:1.計算動畫處理的值;2.把這些值設置到要進行動畫處理的對象和屬性上。ValueAnimator類不執行第二類屬性,所以必須 經過ValueAnimator對象來監聽被計算值的變化,而且要本身修改想要的動畫對象的邏輯。更多的信息請看用ValueAnimator類來進行動 畫處理。(http://developer.android.com/guide/topics/graphics/prop-animation.html#value-animator

ObjectAnimator

ValueAnimator 類的一個子類,它容許給目標對象和對象屬性設置動畫。這個類在計算新的動畫值的時候,會更新屬性的座標。大多數時候都會使用ObjectAnimator 類,由於它使得動畫值的處理更加容易。可是,有些時候也會直接使用ValueAnimator類,由於ObjectAnimator類有更多的限制,如在 目標對象上須要指定用於呈現的acessor方法。

AnimatorSet

提供了一種把動畫組織到一塊兒的機制,以便它們可以彼此相互關聯的運行。你可以設置動畫在一塊兒播放、順序的播放、或者在指定的延時以後播放。更多的信息請看「用Animator Sets來編排多個動畫」

 

評價器會告訴屬性動畫系統如何計算給定屬性的值。它們利用Animator類提供時序數據:動畫的開始和結束值,以及基於這些數據計算得來的屬性動畫值。屬性動畫系統提供了下列評價器:

表2.Evaluators

Class/Interface

說明

IntEvaluator

默認的用於評價int類型屬性計算值的評價器

FlaoatEvaluator

默認的用於評價float類型屬性計算值的評價器

ArgbEvaluator

默認的用於評價顏色屬性計算值的評價器,顏色屬性值用十六進制表示。

TypeEvaluator

容許建立自定義評價器的 接口。若是要讓一個非int、float、顏色類型的屬性具備動畫效果,就必須實現這個TypeEvaluator接口,用它來指定如何計算對象屬性動畫 值。若是想要處理有別於int、float和顏色類型默認行爲的動畫,也可以給它們指定一個自定義的TypeEvaluator。如何編寫自定義的評價 器,請看「使用TypeEvaluator」

 

時間差值給動畫中的時間 函數定義了一個用於計算的具體的值。例如,一個線性過渡的動畫,意味着整個動畫期間動畫都會均勻的移動,或者例如加速開始,減小結束的非線性動畫。表3介 紹了被包含在android.view.animation包中差值。若是那裏沒有適合你須要的差值,你能夠實現TimeInterpolator接口, 建立本身的差值。如何編寫自定義差值的更多信息,請看「使用差值」。

表3.Interpolators

Class/Interface

說明

AccelerateDecelerateInterpolator

變化頻率在開始和結尾處慢,而在中間部分加速

AccelerateInterpolator

變化頻率在開始慢,而後加速

AnticipateInterpolator

先向後,而後向前拋出(拋物運動)

AnticipateOvershootInterpolator

先向後,向前拋出並超過目標值,而後最終返回到目標值。

BounceInterpolator

在結束時反彈

CycleInterpolator

用指定的循環數,重複播放動畫

DecelerateInterpolator

變化頻率是快出,而後減速

LinearInterpolator

固定的變化頻率

OvershootInterpolator

向前拋出,並超過目標值,而後再返回

TimeInterpolator

實現自定義插值的一個接口

相關文章
相關標籤/搜索