屬性動畫
屬性動畫在指定時長內改變一個屬性的值 (屬性指一個對象的一個變量) 可以定義一個屬性動畫隨著時間變化改變一個對象的屬性, 不管這個對象是否畫到屏幕上。
可以為屬性動畫設定如下屬性:
1. Duration: 動畫的時間, 默認為300ms.
2. Time interpolation:時間插值函數. (指定屬性值變化的快慢)
3. Repeat count and behavior:重復次數與行為, 可以指定在動畫結束時是否要重復執行動畫和重復執行的次數. 也可以指定動畫按照原來的方式倒著播放, 如果這樣設置, 它會先正著播放, 再倒著播放,如此反復到最大播放次數.
4. Animator sets:動畫集合, 可以把一系列動畫組成邏輯的集合, 讓他們一起播放或者按順序播放.
5. Frame refresh delay:刷新的頻率, 默認為10ms, 最終的刷新頻率依賴與系統當前的負載和系統定時器的精度.
1. 屬性動畫是怎樣工作的
ValueAnimator對象記錄了動畫的時間, 比如動畫執行多長時間了和被動畫的屬性的當前值. ValueAnimator封裝了一個TimeInterpolator(它定義了動畫的插值函數)和一個TypeEvalutor(它定義了怎樣計算被做動畫的屬性)
為了起動一個動畫, 創建一個ValueAnimator並且給出你要做動畫的屬性的初始值和最終值和動畫的時間. 當調用start()時, 動畫就開始了. 在整個動畫期間, ValueAnimator基於動畫的時間和已經流逝的時間來計算流逝分數(介於0和1之間)
流逝的分數代表了動畫已完成部分的時間, 0表示完成0%, 1表示完成100%.
當ValueAnimator計算完流逝分數時, 它會調用被設置的TimeInterpolator, 去計算一個插值分數. 插值分數把流逝分數和時間插值映射到一個新的分數. 當插值分數計算完了, ValueAnimator會調用合適的TypeEvalutor, 根據插值分數、起始值和最終值計算正在動畫的屬性的值.
2. 屬性動畫和視圖動畫的不同
1. 視圖動畫只能給View對象做動畫.
視圖動畫只能給View對象的一些屬性做動畫, 如縮放和旋轉, 但背景色卻不能被做動畫.
2. 視圖動畫只是改變了視圖被繪制的位置, 而不是View對象本身. 比如可以通過視圖動畫讓按鈕穿過屏幕,但是響應點擊事件的位置卻沒有改變.
3. 屬性動畫能夠給任何對象的任何屬性做動畫, 而且對象本身確實被修改了. 可以指定要做動畫的屬性, 還可以設置插值函數和各個動畫的同步.
4. 視圖動畫代碼比較簡單.
3. 屬性動畫的API
3.1 Animator
3.1.1 ValueAnimator:屬性動畫的主要時序引擎, 它也計算被動畫的屬性的值. 它包含了核心的計算動畫的值的功能, 也包括每一個動畫的信息如是否重復, 更新事件的監聽器和設置計算自定義類型的能力. 為屬性做動畫有兩個要點: 計算被動畫屬性的值和把這些值設置到被動畫的對象上.ValueAnimator不實施第二點, 所以使用者必須自己監聽由ValueAnimator計算出來的值並且根據你的邏輯來修改你要做動畫的對象.
3.1.2 ObjectAnimator:ValueAnimator的子類, 它允許你設置一個目標對象和屬性去做動畫. 當這個類計算完一個新值的時候, 它就相更新相應的屬性. 這個類在使用時有一些限制, 比如在目標對象中必須有相應的更新屬性的方法.
3.1.3 AnimatorSet:提供了把動畫組合在一起的機制, 使不同的動畫可以以某種關系在一起運行. 可以設置動畫一起運行或者順序運行或者在一個給定延遲後運行.
3.2 Evaluator
Evaluator告訴屬性動畫系統怎樣計算給定屬性的值. 它使用Animator類提供的時序數據, 動畫的起始和終止值
計算被動畫的屬性的值
IntEvaluator:計算int屬性的默認Evaluator
FloatEvaluator:計算float屬性的默認Evaluator
ArgbEvaluator:計算顏色屬性的默認Evaluator
TypeEvaluator:如果要做動畫的屬性非上述三個, 或者想改變上述三個屬性的默認行為, 可以實現這個接口.
3.3 Interpolator
時間插值器定義了動畫中的特定值(做為時間的函數)是怎樣計算出來的.
AccelerateDecelerateInterpolator
AccelerateInterpolator
AnticipateInterpolator
AnticipateOvershootInterpolator
BounceInterpolator
CycleInterpolator
DecelerateInterpolator
LinearInterpolator
OvershootInterpolator:
TimeInterpolator:一個可以實現自定義插值器的接口
4. 指定KeyFrame(關鍵幀)
一個KeyFrame對象由一個時間/值對組成, 可以用它定義一個動畫在一個特定時間的狀態. 每一個KeyFrame可以指定它自己的插值器, 用於控制上一個關鍵幀和當前關鍵幀中間這段時間的行為.
5. 給View做動畫
屬性動畫系統比視圖動畫系統多了一些優點. 視圖動畫系統只是改變View的繪制方式, 但並不改變View本身. 如點擊事件的響應的位置不會因為繪制的位置不同而改變. 屬性動畫可以通過改變View對象的真實屬性做動畫. 然後View自動調用它的invalidate()方法刷新屏幕.
View中可以做屬性動畫的屬性有
translationX和translationY:控制View的位置
rotation, rotationX, rotationY:控制在2D和3D坐標系中相對於坐標原點的旋轉.
scaleX, scaleY:控制一個View對象相對於坐標原點的縮放.
pivotX, pivotY:View對象進行旋轉和縮放所發生的點的位置, 默認為View對象的中心.
x, y:描述View在其容器中的最終位置.
alpha:View的透明度.
5.1 使用ViewPropertyAnimator做動畫
ViewPropertyAnimator可以給幾個屬性做並行動畫處理, 它的行為和ObjectAnimator很像,但是做多屬性的動畫時會更加高效.
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
5.2 在XML中聲明動畫
為了區分新的屬性動畫API, 應該把屬性動畫的xml文件放在res/animator中而不是res/anim.
xml中支持如下三個標簽
ValueAnimator - <animator>
ObjectAnimator - <objectAnimator>
AnimatorSet - <set>
<set Android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="intType"/>
</set>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1f"/>
</set>
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11