天天看點

Android--Tween補間動畫

Animation

  在Android中使用Tween補間動畫需要得到Animation的支援,它處于"android.view.animation.Animation"包下,是一個抽象類,其中抽象了一些動畫必須的方法,其子類均有對其進行實作,而在Android下完成補間動畫也就是在操作Animation的幾個子類。

  補間動畫和逐幀動畫一樣,可以使用XML資源檔案定義,也可以使用Java代碼定義。下面提供一些常用Animation中定義的屬性,同樣都提供了XML屬性以及對應的方法,它們主要用來設定補間動畫的一些效果:

android:duration/setDuration(long):動畫單次播放時間。

android:fillAfter/setFillAfter(boolean):動畫是否保持播放結束位置。

android:fillBefore/setFillBefore(boolean):動畫是否保持播放開始位置。

android:interpolator/setInterpolator(Interpolator):指定動畫播放的速度曲線,不設定預設為勻速。

android:repeatCount/setRepeatCount(int):動畫持續次數,如2,會播放三次。

android:repeatMode/setRepeatMode(int):動畫播放模式。

android:startOffset/setStartOffset(long):動畫延遲播放的時長,機關是毫秒。

  Animation中内置的方法并不隻有這些,還有一些其他的控制細節的方法,有需要可以查詢官方文檔,這裡不再詳細講解。

  上面提到,Android下對于補間動畫的支援,主要是使用Animation的幾個子類來實作,下面分别介紹Animation下的幾個子類:

AlphaAnimation:控制動畫透明度的變化。

RotateAnimation:控制動畫旋轉的變化。

ScaleAnimation:控制動畫成比例縮放的變化。

TranslateAnimation:控制動畫移動的變化。

AnimationSet:以上幾種變化的組合。

  上面幾個Animation也包含了補間動畫的幾種變化,如果需要使用XML資源檔案定義補間動畫,需要把XML資源檔案定義在/res/anim/目錄下,在需要使用的地方通過AnimationUtils.loadAnimation(int)方法指定XML動畫ID來加載一段動畫。AnimationUtils是動畫工具類,其中實作了一些靜态的輔助動畫操作的方法。

  例如:

<a></a>

  AlphaAnimation,是Animation的子類,它用來控制透明度改變的動畫。建立該動畫的時候要指定動畫開始的透明度、結束時候的透明度和動畫的持續時間。其中透明度可以使用0~1之間的float類型的數字指定,0為透明,1為不透明。

  AlphaAnimation有兩個構造函數,這裡講一個最常用最直覺的,下面是它的完整簽名:

    AlphaAniamtion(float fromAlpha,float toAlpha)

  上面方法指定以兩個float類型的參數設定了動畫開始(fromAlpha)和結束(toAlpha)的透明度。

  使用Java代碼定義AlphaAnimation動畫:

  同樣可以使用XML資源檔案設定AlphaAnimation,它需要使用&lt;alpha.../&gt;标簽,為其添加各項屬性:

  在使用XML資源檔案的時候,使用AnimationUtils.loadAnimation()方法加載它即可。

  效果展示:

Android--Tween補間動畫

  RotateAnimation,是Animation的子類,它用來控制動畫的旋轉,建立該動畫時隻要指定動畫旋轉的"軸心坐标"、開始時的旋轉角度、結束時的旋轉角度,并指定動畫持續時間即可。

  RotateAnimation有多個構造函數,這裡講一個參數最多的,下面是它的完整簽名: 

    RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXVlaue,int pivotYType,float pivotYValue)

  RotateAnimation中,fromDegrees和toDegrees分别指定動畫開始和結束的旋轉角度,pivotXType和pivotYType指定旋轉中心的參照類型,它們以靜态常量的形式定義在Animation中,pivotXVlaue和pivotYValue指定旋轉中心的位置。

  使用Java代碼定義RotateAnimation:

  同樣可以使用XML資源檔案定義RotateAnimation,它需要使用&lt;rotate.../&gt;标簽,為其添加各項屬性:

Android--Tween補間動畫

  ScaleAnimation,是Animation的子類,它用來控制動畫的縮放。建立該動畫時要指定開始縮放的中心坐标、動畫開始時的縮放比、結束時的動畫縮放比,并指定動畫的持續時間即可。

  ScaleAnimation有多個構造函數,這裡講一個參數最多的,下面是它的完整簽名:

    ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

  上面ScaleAnimation構造函數中,fronX、 toX、fromY、toY,分别指定了縮放開始和結束的坐标,pivotXType和pivotYType設定了縮放的中心類型,pivotXValue和pivotYValue設定了縮放中心的坐标。

  使用Java代碼定義ScaleAnimation:

  同樣可以使用XML資源檔案定義ScaleAnimation,它需要使用&lt;scale.../&gt;标簽,為其添加各項屬性:

Android--Tween補間動畫

  TranslateAnimation,是Animation的子類,它用來控制動畫的移動。建立該動畫隻要指定動畫開始時的位置、結束時的位置,并指定動畫持續的時間即可。

   TranslateAnimation有多個構造函數,這裡講一個參數最多的,下面是它的完整簽名:

    TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

  上面TranslateAnimation構造函數中,它們指定了動畫開始的點類型以及點位置和動畫移動的X、Y點的類型以及值。

  使用Java代碼定義TranslateAnimation:

  同樣可以使用XML資源檔案定義TranslateAnimation,它需要使用&lt;translate.../&gt;标簽,為其添加各項屬性:

Android--Tween補間動畫

  AnimationSet,組合動畫,,是Animation的子類。有些場景需要完成透明度變化、旋轉、縮放、移動等多種變化,那麼就可以使用AnimationSet來完成,它可以使用addAnimation(Animation)添加多個動畫進行組合播放。

  AnimationSet有多個構造函數,這裡講一個最常用的,下面是它的完整簽名:

    AnimationSet(boolean shareInterpolator)

  它隻有一個boolean的參數,指定是否每個動畫分享自己的Interpolator,關于Interpolator的内容後面讨論,如果為false,則每個AnimationSet中的每個動畫,使用自己的Interpolator。

  使用Java代碼定義AnimationSet:

  同樣可以使用XML資源檔案定義AnimationSet,它需要使用&lt;set.../&gt;标簽,為其添加各項屬性:

Android--Tween補間動畫

  上面看到,RotateAnimation、ScaleAnimation、TranslateAnimation都存在一對pivotXType,pivotYType參數,它們是用來指定點的參照類型,使用int類型以靜态常量的形式定義在Animation中,它有如下個值:

ABSOLUTE:以絕對坐标為參照。

RELATIVE_TO_PARENT:以父容器為參照。

RELATIVE_TO_SELF:以目前容器為參照。

  細心的朋友有發現到,在使用XML定義動畫資源的時候,沒有關于pivotXType、pivotYType兩個屬性,其實它們結合到了設定點的坐标中中,以 pivotXValue、pivotYValue兩個屬性替代,其中如果需要設定為父容器為參照,需要在屬性值後面加"p"即可。

  補間動畫定義的是動畫開始、結束的關鍵幀,Android需要在開始幀、結束幀之間動态計算,插入大量幀,而Interpolator用于控制"插入幀"的行為。

  Interpolator根據特定算法計算出整個動畫所需要動态插入幀的密度和位置,簡單來說,Interpolator負責控制動畫的變化速率,用來設定與基本動畫(Alpha、Scale、Rotate、Translate)的動畫播放速率。

  Interpolator是一個接口,它定義了的所有Interpolator都需要實作方法:float getInterpolation(float)方法,如果需要自定義動畫的變化速率,隻需要重寫這個接口即可,Android已經為開發人員提供了一些Interpolator的實作類,這裡介紹幾個常用的:

LineraInterpolator:動畫以勻速的速度變化,預設值。

AccelerateInterpolator:在動畫開始的時候變化速度較慢,之後開始加速。

AccelerateDecelerateInterpolator:在動畫開始、結束的地方改變速度較慢,中間的時候加速。

CycleInterpolator:動畫循環播放特定的次數,變化速度按照正弦曲線變化。

DecelerateInterpolator:在動畫開始的地方速度較快,然後開始減速。

本文轉自承香墨影部落格園部落格,原文連結:http://www.cnblogs.com/plokmju/p/android_TweenAnimation.html,如需轉載請自行聯系原作者

繼續閱讀