Android系統編程入門系列之界面Activity響應多元的屬性動畫

響應絲滑動畫一篇文章中,分別介紹了做用於普通視圖、繪製視圖的繪製對象、和界面這三種對象的動畫效果,可是都有一些使用的侷限性。好比這些動畫都只是以屏幕上繪製更新的方式繪製動畫,並無真實改變做用對象的實際位置或屬性,這種問題在視圖動畫中尤其明顯,在沒有特別設置時,動畫結束後的視圖狀態會還原到動畫前,也就是說動畫中及動畫後的視圖對象是沒有保存動畫中用到的一些屬性的。這種狀況就須要使用本文所介紹的屬性動畫了。html

屬性動畫本質是對某個對象的屬性提供一組變化更新的屬性值,他的做用對象不只能夠是視圖和界面,也能夠是任何具備上述需求的對象類。在Android3.0 API 11開始的AndroidSDK版本中,定義了android.animation.Animator類做爲抽象父類來描述屬性動畫的結構,並提供了android.animation.ValueAnimator做爲只變化屬性值的屬性動畫類、android.animation.ObjectAnimator能夠變化屬性值並更新到對象屬性的屬性動畫類、和android.animation.AnimatorSet包含多個屬性動畫集合的屬性動畫類。android

與普通動畫相似,屬性動畫一樣能夠在資源文件中靜態聲明,也能夠在代碼中動態聲明,可是因爲其做用對象能夠是任何對象,並且屬性動畫的優點在於爲做用對象的屬性提供一組變化的屬性值,因此屬性動畫只能在須要綁定做用對象的代碼位置動態使用。因爲靜態聲明的屬性動畫能夠針對多個對象使用,在開發過程當中推薦使用靜態聲明+動態使用的方式。動畫

只變化屬性值的屬性動畫類

ValueAnimator做爲最核心的屬性動畫類,能夠調用ValueAnimator.ofArgb(int... values)ValueAnimator.ofFloat(float... values)ValueAnimator.ofInt(int... values)ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values)系列靜態方法,獲取初始化後的實例化對象。其中的參數 values 是可變長參數,做爲可變化屬性值的範圍區間。而參數 evaluatorandroid.animation.TypeEvaluator估值器接口的實現類,用以計算估計屬性值的具體變化數值的類。而AndroidSDK中已經定義了上述系列靜態方法前三種類型對應的估值器子類,分別是android.animation.ArgbEvaluatorandroid.animation.FloatEvaluatorandroid.animation.IntEvaluator,除此以外還有計算二維座標系的估值器android.animation.PointFEvaluator和計算矩形座標的估值器android.animation.RectEvaluator。另外,在實際開發中針對做用對象要變化的屬性值類型不一樣,也能夠自定義實現TypeEvaluator接口的估值器。ui

這裏提到的ArgbEvaluator是用以計算顏色的 ARGB 色值估值器,與Android系統定義的屏幕座標相似,這裏的 ARGB 色值也是一套系統顏色規範。在Java中int類型是用4個字節存儲的,這4個字節按順序從大端到小端,恰好分別表示Alpha(顏色值中的透明度),Red(顏色值中的紅色值),Green(顏色值中的綠色值),Blue(顏色值中的藍色值),每一個字節的數值能夠表示範圍是[ 0x0, 0xFF ],因此用十六進制表示顏色值中的純紅色爲 0xFFFF0000 ,純黑色爲 0xFF000000 ,純白色爲 0xFFFFFFFF ,而徹底透明色爲 0x000000000x00FFFFFF 之間的任一值。也能夠藉助android.graphics.Color類使用已經定義的顏色值和系統顏色規範的相關方法。google

在建立ValueAnimator實例化對象後,
能夠調用setDuration(long duration)設置完成一次動畫效果的持續時間,單位爲 ms 毫秒。
調用setRepeatCount(int value)設置完成一次動畫效果後的重複次數,默認 value = ValueAnimator.INFINITE 爲無限循環。
調用setRepeatMode(int value)設置在完成一次動畫效果後重復時的動畫效果,其 value 只能爲
ValueAnimator.RESTART 表示從頭開始從新完成一次如出一轍的動畫效果,
ValueAnimator.REVERSE 表示從上次動畫結尾開始完成一次倒放的動畫效果。
調用 setInterpolator(TimeInterpolator value)設置動畫效果的時間插值器。與上面的估值器定義結構相似,參數 valueandroid.animation.TimeInterpolator插值器接口的實現類,用以肯定每次更新動畫效果的時間。一樣的,AndroidSDK已經定義了一系列插值器,包括但不限於持續加速插值器android.view.animation.AccelerateInterpolator、持續減速插值器android.view.animation.DecelerateInterpolator、線性勻速插值器android.view.animation.LinearInterpolator等,一樣在實際開發中針對動畫效果展現時間進度,也能夠自定義實現TimeInterpolator接口的插值器。lua

最終在須要啓動當前屬性動畫的位置調用start()即開始播放當前動畫效果,若是不想在調用屬性動畫的啓動方法後當即執行相關動畫效果,能夠在啓動方法以前調用setStartDelay(long startDelay)設置延時動畫的延長時間,單位是 ms 毫秒。code

ValueAnimator是根據TypeEvaluator估值器來更新屬性值的,而更新的時間則是由TimeInterpolator插值器決定的,那麼怎麼才能拿到每次更新後的屬性值呢?這裏就能夠用調用ValueAnimator對象的addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)方法添加屬性動畫更新監聽,在AnimatorUpdateListener類中重寫onAnimationUpdate(ValueAnimator animation)方法,該方法中的參數animation即更新後的屬性動畫對象,經過調用animation.getAnimatedValue()來接收每次更新後的屬性值,並能夠將更新後的屬性值賦值給須要屬性動畫的對象中。xml

也能夠在資源文件中靜態定義屬性動畫,在 res/animator 目錄下,定義xml格式的屬性動畫資源文件,該資源文件內以<animator />爲根標籤,其中能夠設置android:duration做爲完成一次動畫效果的持續時間等一系列屬性,與代碼中動態設置的相關方法相似。以後在代碼使用位置加載該資源文件,經過調用AnimatorInflater.loadAnimator(Context context, int id)的靜態方法,參數context做爲調用位置所在的上下文環境,參數id則是要加載的屬性動畫類型的資源文件名。將獲得Animator抽象類的返回結果,根據所加載資源文件中的根標籤名判斷,若是與<animator />一致,則可將返回的Animator抽象類直接轉換爲ValueAnimator類型的對象。htm

可變化屬性值並更新到對象屬性的屬性動畫類

ObjectAnimator做爲ValueAnimator的子類,定義和使用方式都有相似的地方,只是ObjectAnimator類中封裝了屬性動畫的更新監聽方法,所以只要綁定對象及其要變化的屬性,在屬性動畫每次變化屬性值時,都會主動將屬性值更新到綁定對象的相關屬性上。對象

所以在初始化實例對象時須要調用ofArgb(Object target, String propertyName, int... values)ofFloat(Object target, String xPropertyName, String yPropertyName, Path path)ofInt(T target, Property<T, Integer> property, int... values)ofObject(T target, Property<T, V> property, TypeConverter<PointF, V> converter, Path path)等系列靜態方法。
其中參數 target 即爲要綁定的動畫效果做用對象;
參數 propertyNametarget 對象中的某個屬性,並且該屬性必需要有符合駝峯命名規則的 getset 方法;
參數 values 仍然做爲可變化屬性值的範圍區間;
參數 path 做爲android.graphics.Path類,則表示一段動畫效果的執行路徑,以此替換參數 values 表示的單一變化區間;
參數 property 做爲android.util.Property抽象類,一樣描述某種屬性類型,以此替換String類型的參數 propertyName
參數 converter 做爲android.animation.TypeConverter抽象類,與上文的參數 property 同時使用,當 property 中聲明的屬性類型與實際變化更新的屬性值不一致時,使用參數 converter 所表示的強制類型轉換方式。

在建立實例化對象後,ObjectAnimator有與ValueAnimator一致的setXXX()getXXX()系列方法,另外還有setTarget(Object target)方法能夠直接綁定要變化屬性值的目標對象,同時有setPropertyName(String propertyName)setProperty(Property property)兩種調用方法,都能實現對目標對象中的目標屬性的綁定。

最後仍然是在須要啓動當前屬性動畫的位置調用start()開始播放當前動畫效果。

在資源文件中靜態定義時,一樣在 res/animator 目錄下,定義xml格式的屬性動畫資源文件,不過該資源文件內根標籤爲<objectAnimator />以標記關聯對象的屬性動畫,其中的屬性設置不只與只變化屬性值的ValueAnimator對應的<animator />標籤中的屬性一致,還可單獨設置android:propertyName綁定屬性名稱。以後一樣能夠在代碼中調用AnimatorInflater.loadAnimator(Context context, int id)靜態方法加載當前屬性動畫資源文件,一樣地,針對獲得的Animator抽象類的返回結果,根據所加載資源文件中的根標籤名判斷,若是與<objectAnimator />一致,則可將返回的Animator抽象類直接轉換爲ObjectAnimator類型的對象。

包含多個屬性動畫集合的屬性動畫類

SetAnimator是將一系列上述單獨的屬性動畫組合起來的屬性動畫合集,其使用目的主要是爲了講不一樣的屬性動畫按照同一條時間線整理播放,所以其相關方法主要與其中子動畫的播放順序相關。

經過直接建立SetAnimator()構造方法能夠得到SetAnimator實例化對象。
獲得的對象調用playTogether(Animator... items)方法能夠在同一段時間內播放添加的子動畫,
調用playSequentially(Animator... items)方法能夠將其中的子動畫按照添加順序播放,
而這兩個系列方法中的可變長參數 items 便是要添加的系列子動畫對象。

也能夠將獲得的對象調用play(Animator anim)方法,參數 anim 爲添加的基本動畫,返回android.animation.AnimatorSet.Builder類型,能夠調用該類的before(Animator anim)方法設置針對基本動畫以前播放的動畫 anim 、調用該類的with(Animator anim)方法設置與基本動畫同時播放的動畫 anim 、調用該類的after(Animator anim)方法設置針對基本動畫以後播放的動畫 anim 、以及該類的after(long delay)方法設置在基本動畫以後延時 delay 毫秒以後繼續播放以後動畫。

最後仍然是在須要啓動當前屬性動畫的位置調用start()開始播放當前動畫效果。

在資源文件中靜態定義時,一樣在 res/animator 目錄下,定義xml格式的屬性動畫資源文件,在資源文件內根標籤爲<set></set>以標記爲集合屬性動畫,該標籤內能夠設置屬性android:ordering,其值只能爲默認的together表示子動畫同時執行,或者爲sequentially表示子動畫按順序執行。在<set></set>標籤內部,能夠嵌入上述<animator /><objectAnimator />兩種屬性動畫標籤。一樣能夠在代碼中調用AnimatorInflater.loadAnimator(Context context, int id)靜態方法加載當前屬性動畫資源文件,一樣地,針對獲得的Animator抽象類的返回結果,根據所加載資源文件中的根標籤名判斷,若是與<set></set>一致,則可將返回的Animator抽象類直接轉換爲AnimatorSet類型的對象。

相關文章
相關標籤/搜索