一,使用ObjectAnimator實現動畫
該類作為ValueAnimator的子類不僅繼承了ValueAnimator的所有方法和特性,並且還封裝很多實用的方法,方便開發人員快速實現動畫。同時,由於屬性值會自動更新,使用ObjectAnimator實現動畫不需要像ValueAnimator那樣必須實現 ValueAnimator.AnimatorUpdateListener ,因此實現任意對象的動畫顯示就更加容易了。我們在大部分的開發工作中,都會使用ObjectAnimator而非ValueAnimator實現我們所需的動畫效果。
- translationX 和 translationY:這兩個屬性控制着 View 的屏幕位置坐標變化量,以 layout 容器的左上角為坐標原點;
- rotation、rotationX 和 rotationY:這三個屬性控制着 2D 旋轉角度(rotation屬性)和圍繞某樞軸點的 3D 旋轉角度;
- scaleX、scaleY:這兩個屬性控制着 View 圍繞某樞軸點的 2D 縮放比例;
- pivotX 和 pivotY: 這兩個屬性控制着樞軸點的位置,前述的旋轉和縮放都是以此點為中心展開的,缺省的樞軸點是 View 對象的中心點;
- x 和 y:這是指 View 在容器內的最終位置,等於 View 左上角相對於容器的坐標加上 translationX 和 translationY 后的值;
- alpha:表示 View 的 alpha 透明度。缺省值為 1 (不透明),為 0 則表示完全透明(看不見);
要動畫顯示 View 對象的某個屬性,比如顏色或旋轉值,我們所有要做的事情就是創建一個 Property animation,並設定對應的 View 屬性。那接下來我們就用ObjectAnimator類來分別實現View的透明度漸變、收縮、移動和旋轉等動畫效果,那在此之前我們也來總結下使用ObjectAnimator實現動畫的幾個步驟,如下:
- 通過調用ofFloat()、ofInt()等方法創建ObjectAnimator對象,並設置目標對象、需要改變的目標屬性名、初始值和結束值;
- 設置動畫的持續時間、是否重復及重復次數等屬性;
- 啟動動畫。
二,使用ValueAnimator實現動畫
ValueAnimator是Property Animation系統的核心類,它包含了配置Property Animation屬性的大部分方法,那要實現一個Property Animation,都需要直接或間接使用ValueAnimator類。那接下來我們將借助ValueAnimator類提供的方法來實現各種各樣的動畫效果,不過在此之前我們來學習一下實現動畫的幾個關鍵知識點。使用ValueAnimator實現動畫的步驟及實踐
那一般使用ValueAnimator實現動畫分為以下七個步驟:
- 調用ValueAnimation類中的ofInt(int...values)、ofFloat(String propertyName,float...values)等靜態方法實例化ValueAnimator對象,並設置目標屬性的屬性名、初始值或結束值等值;
- 調用addUpdateListener(AnimatorUpdateListener mListener)方法為ValueAnimator對象設置屬性變化的監聽器;
- 創建自定義的Interpolator,調用setInterpolator(TimeInterpolator value)為ValueAniamtor設置自定義的Interpolator;(可選,不設置默認為缺省值)
- 創建自定義的TypeEvaluator,調用setEvaluator(TypeEvaluator value)為ValueAnimator設置自定義的TypeEvaluator;(可選,不設置默認為缺省值)
- 在AnimatorUpdateListener 中的實現方法為目標對象的屬性設置計算好的屬性值。
- 設置動畫的持續時間、是否重復及重復次數等屬性;
- 為ValueAnimator設置目標對象並開始執行動畫。
不過呢使用ObjectAnimator實現動畫也有一些要求和限制,一般有以下幾點需要注意:
- 動畫顯示的屬性必須帶有一個 setter 方法(以駱駝拼寫法命名),格式類似 set<propertyName>()。 因為 ObjectAnimator 會在動畫期間自動更新屬性值,它必須能夠用此 setter 方法訪問到該屬性。 例如:假設屬性名稱為foo,則需要有一個setFoo()方法。 而你如果此 setter 方法不存在,那么我們可以有以下三種選擇:
- 如果權限允許的話,直接在類中增加此 setter 方法;
- 修改封裝類來增加此 setter 方法,並讓該封裝類來接收屬性值並傳給初始的對象;
- 換用 ValueAnimator。
- 如果在調用 ObjectAnimator 的某個工廠方法時,我們只為 values... 參數指定了一個值,那此值將被認定為動畫屬性的結束值。 這樣的話,動畫顯示的屬性必須帶有一個 getter 方法,用於獲取動畫的起始值。 此 getter 方法必須以get<propertyName>()的格式命名。 例如:假設屬性名為foo,則需要有一個getFoo()方法。
- 動畫屬性的 getter 方法(如果必要的話)和 setter 方法所操作數據的類型必須與 ObjectAnimator 中設定的起始和結束值相同。