星期日, 1月 22, 2012

Animation (五)

Android應用程式學習筆記

Animating with ValueAnimator

ValueAnimator類別讓你藉由指定一組整數、浮點數、顏色的動畫數值來定義一些型態的動畫,你可以呼叫其中的方法ofInt()、offloat()、ofobject()獲得一個ValueAnimator。例如:


ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();

在此程式碼中,當start()方法運行,ValueAnimator開始計算動畫數值,數值介於0與1之間,動畫時間1000豪秒。

你也可以指定自定義的動畫:


ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();

在此程式碼中,當start()方法運行,ValueAnimator開始計算動畫數值,數值介於startPropertyValue與endPropertyValue之間提供MyTypeEvaluator物件使用,動畫時間1000毫秒。

前一程式碼片段沒有實際效果,因為ValueAnimator沒有直接地操作物件或屬性。你想做的最有可能的事情是改變物件讓它依你想動畫的計算數值。你可以為ValueAnimator定義適合的監聽器處理在動畫期間重要的事件,例如框架更新。當執行監聽器,你可以呼叫getAnimatorValue()方法獲得計算指定框架更新的數值,在Animation Listener文章中獲得更多監聽器的資訊。


Animating with ObjectAnimator

ObjectAnimator是ValueAnimator的子類並結合時序引擎及ValueAnimator的數值計算,利用這些功能完成目標物件的動畫。ObjectAnimator較輕易對任何物件完成動畫,你不再需要實現ValueAnimator.AnimatorUpdateListener,因為動畫屬性會自動更新。

實作一個ObjectAnimator與實作VlaueAnimator相似,但是你也可以隨著動畫指定數值給物件及物件屬性名稱。


ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();

正確地更新ObjectAnimator,你必須照著以下去做:

  • 你正在動畫的物件屬性必須有一個格式為set<propertyName>()的setter函式,因為ObjectAnimator會在動畫期間自動地更新屬性,它必須能夠用setter函式存取屬性。舉例,如果屬性名稱為foo,你需要一個setfoo()的方法。如果這個setter方法不存在,你有三種選擇:
    • 如果你有權力如此做,你就在類別中加入一個setter方法。
    • 利用包裝類別讓你有權力改變並有包裝類接收來自有效的設定方法的數值,並發送到原本的物件。
    • 用ValueAnimator代替。
  • 如果你只能在一個ObjectAnimator工廠方法指定一個values...參數的數值,它被假定為動畫結束的數值。因此你動畫的物件屬性必須有一個getter方法,用來獲得動畫一開始的數值。這個getter方法必須是get<propertyNmae>()格式。比如,你有一個屬性名稱為foo,你必須有一個getfoo()方法。
  • 你正在動畫的屬性的getter與setter方法必須運轉在相同型態,作為指定給ObjectAnimator的起始與結束值。例如,如果你建立以下的ObjectAnimator,必須有targetObject.setPropName(float)及targetObject.getPropName(float)。
  • ObjectAnimator.ofFloat(targetObject, "propName", 1f)
  • 根據你動畫的物件或是屬性,你可能需要在一個視圖用更新的動畫數值強制在屏幕上重繪時呼叫invalidate()方法,你在onAnimateUpdate()回呼方法中如此做。例如,動畫Drawable物件的顏色屬性只會導致當物件重繪時更新到屏幕,所有視圖的屬性setter,比如setAlpha()方法及setTranslationX()方法適當地廢止視圖,所以你不需要當用新的數值呼叫這些方法去廢止視圖。更多有關監聽器的資訊,會在Animation listener文章中說明。

沒有留言:

張貼留言