1. 程式人生 > >【Android開發】圖形影象處理技術-實現Android動畫的兩種方式

【Android開發】圖形影象處理技術-實現Android動畫的兩種方式

在應用Android進行專案開發時,特別是在進行遊戲開發時,經常需要涉及動畫。Android中的動畫通常可以分為逐幀動畫(Frame Animation)和補間動畫(Tween Animation)兩種。下面將分別介紹這兩種動畫。

一.實現逐幀動畫(Frame Animation)
逐幀動畫就是順序播放事先準備好的靜態影象,利用人眼的"視覺暫留"原理,給使用者造成動畫的錯覺。實現逐幀動畫比較簡單,只需要一下兩個步驟:
(1)在Android XML資原始檔中定義一組用於生成動畫的圖片資源,可以使用包含一系列<item></item>子標記的<animation-list></animation-list>標記來實現,具體語法格式如下:
<animation xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true|false">
    <item android:drawable="@drawable/圖片資源名1" android:duration="integer"/>
    ......<!--此處省略了部分<item></item>標記-->......
    <item android:drawable="@drawable/圖片資源名n" android:duration="integer"/>
</animation>

在上面的語法中,android:oneshot屬性用於設定是否迴圈播放,預設值為true,表示迴圈播放;android:drawable屬性用於指定要顯示的圖片資源;android:duration屬性指定圖片資源持續的時間。

(2)使用(1)中定義的動畫資源。可以作為某佈局管理器的背景使用,也可以作為ImageView的背景使用。

在Android中逐幀動畫需要得到AnimationDrawable類的支援,它位於"android.graphics.drawable.AnimationDrawable"包下,是Drawable的間接子類。它主要用來建立一個逐幀動畫,並且可以對幀進行拉伸,把它設定為View的背景即可使用AnimationDrawable.start()方法播放。既然逐幀動畫是需要播放一幀一幀的影象,所以需要為其新增幀。在Android中提供了兩種方式為AnimationDrawable新增幀:XML定義的資原始檔和Java程式碼建立,後面再詳細講講這兩種新增幀的方式。

簡單介紹一下AnimationDrawable的常用方法:
 
void start():開始播放逐幀動畫。
void stop():停止播放逐幀動畫。
void addFrame(Drawable frame,int duration):為AnimationDrawable新增一幀,並設定持續時間。
int getDuration(int i):得到指定index的幀的持續時間。
Drawable getFrame(int index):得到指定index的幀Drawable。
int getNumberOfFrames():得到當前AnimationDrawable的所有幀數量。
boolean isOneShot():當前AnimationDrawable是否執行一次,返回true執行一次,false迴圈播放。
boolean isRunning():當前AnimationDrawable是否正在播放。
void setOneShot(boolean oneShot):設定AnimationDrawable是否執行一次,true執行一次,false迴圈播放

二.實現補間動畫(Tween Animation)
補間動畫就是通過對場景裡的物件不斷進行影象變化來產生動畫效果。在實現補間動畫時,只需定義動畫開始和動畫結束的關鍵幀,其他過渡幀由系統自動計算補齊。在Android中,提供了4種補間動畫。

(1)透明度漸變動畫(AlphaAnimation)
通過設定物件開始時與結束時的透明度以及持續時間來給物件建立一個透明度漸變的動畫。基本的語法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource">
    <alpha 
        android:repeatMode="reverse|restart"
        android:repeatCount="次數|infinite"
        android:duration="Integer"
        android:fromAlpha="float"
        android:toAlpha="float"/>
</set>

在上面的語法中,各屬性說明如表1.1所示:

表1.1
interpolator    屬性為控制動畫的變化速度(加速、勻速、減速或拋物線速度等,如表1.2)
fromAlpha屬性為動畫起始時透明度
toAlpha屬性為動畫結束時透明度
(0.0表示完全透明,1.0表示完全不透明,以上值取0.0-1.0之間的float資料型別的數字)
duration屬性為持續時間,單位為毫秒
repeatCount屬性為設定動畫重複次數,可以是數值,也可以是infinite(無限迴圈)
repeatMode屬性為設定動畫的重複方式,可選值為reverse(反向)和restart(重新開始)

表1.2
@android:anim/accelerate_decelerate_interpolator 在動畫開始與結束的地方速率改變比較慢,在中間的時候加速

@android:anim/accelerate_interpolator  在動畫開始的地方速率改變比較慢,然後開始加速

@android:anim/anticipate_interpolator 開始的時候先後退一小步再開始動畫

@android:anim/anticipate_overshoot_interpolator 開始的時候先後退一小步再開始動畫,到結束的地方再超出一小步,回到動畫結束的地方

@android:anim/bounce_interpolator   動畫結束的時候彈起

@android:anim/cycle_interpolator 動畫迴圈播放特定的次數,速率改變沿著正弦曲線

@android:anim/decelerate_interpolator 在動畫開始的地方快然後慢

@android:anim/linear_interpolator   以常量速率改變

@android:anim/overshoot_interpolator   快速達到終點並超出一小步,最後回到動畫結束的地方


例如,定義一個讓View元件從完全透明到完全不透明、持續時間為2秒的動畫,可以使用下面的程式碼:
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0"
           android:toAlpha="1"
    android:duration="2000">
</set>

(2)旋轉動畫(RotateAnimation)
通過設定物件開始時與結束時的旋轉角度以及持續時間來給物件建立一個旋轉物件的動畫。還可以通過指定軸心點座標來改變旋轉的中心,基本的語法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource">
    <rotate
	android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:repeatMode="reverse|restart"
        android:repeatCount="次數|infinite"
        android:duration="Integer"/>
</set>

在上面的語法中,各屬性說明如表2.1所示:

表2.1
interpolator    上一個動畫已經介紹過(控制動畫變化速度)
fromDegrees屬性為指定動畫開始時的旋轉角度
toDegrees屬性為指定動畫結束時的旋轉角度
pivotX屬性為指定軸心點的X座標
pivotY屬性為指定軸心點的Y座標
duration屬性為持續時間,單位為毫秒
repeatCount屬性為設定動畫重複次數,可以是數值,也可以是infinite(無限迴圈)
repeatMode屬性為設定動畫的重複方式,可選值為reverse(反向)和restart(重新開始)

例如,定義一個讓圖片從0度轉到360度、持續時間為2秒、中心點在圖片的中心的動畫,可以使用下面的程式碼:
<rotate
	android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000">
</rotate>

(3)縮放動畫(ScaleAnimation)
通過設定物件開始時與結束時的縮放係數以及持續時間來給物件建立一個縮放物件的動畫。還可以通過指定軸心點座標來改變縮放的中心,基本的語法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource">
    <scale
	android:fromXScale="float"
        android:toXScale="float"
	android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float"
        android:repeatMode="reverse|restart"
        android:repeatCount="次數|infinite"
        android:duration="Integer"/>
</set>

在上面的語法中,各屬性說明如表2.1所示:

表2.1
interpolator    已經介紹過(控制動畫變化速度)
fromXScale屬性為指定動畫開始時水平方向上的縮放係數(值為1.0表示不變化)
toXScale屬性為指定動畫結束時水平方向上的縮放係數(值為1.0表示不變化)
fromYScale屬性為指定動畫開始時垂直方向上的縮放係數(值為1.0表示不變化)
toYScale屬性為指定動畫結束時垂直方向上的縮放係數(值為1.0表示不變化)
pivotX屬性為指定軸心點的X座標
pivotY屬性為指定軸心點的Y座標
duration屬性為持續時間,單位為毫秒
repeatCount屬性為設定動畫重複次數,可以是數值,也可以是infinite(無限迴圈)
repeatMode屬性為設定動畫的重複方式,可選值為reverse(反向)和restart(重新開始)


例如,定義一個以圖片的中心點為軸心點,將圖片放大2倍的,持續時間為2秒的動畫,可以使用下面的程式碼:
<scale
	android:fromXScale="1"
        android:toXScale="2.0"
	android:fromYScale="1"
        android:toYScale="2.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000">
</scale>

(4)平移動畫(Translate Animation)
通過設定物件開始時與結束時的位置以及持續時間來給物件建立一個縮放物件的動畫。基本的語法格式如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource">
    <translate
	android:fromXDelta="float"
        android:toXDelta="float"
	android:fromYDelta="float"
        android:toYDelta="float"
        android:repeatMode="reverse|restart"
        android:repeatCount="次數|infinite"
        android:duration="Integer"/>
</set>

在上面的語法中,各屬性說明如表2.1所示:

表2.1
interpolator    已經介紹過(控制動畫變化速度)
fromXDelta屬性為指定動畫開始時水平方向上的起始位置
toXDelta屬性為指定動畫結束時水平方向上的起始位置
fromYDelta屬性為指定動畫開始時垂直方向上的起始位置
toYDelta屬性為指定動畫結束時垂直方向上的起始位置
duration屬性為持續時間,單位為毫秒
repeatCount屬性為設定動畫重複次數,可以是數值,也可以是infinite(無限迴圈)
repeatMode屬性為設定動畫的重複方式,可選值為reverse(反向)和restart(重新開始)

例如,定義一個讓圖片從(0,0)點到(300,300)點、持續時間為2秒鐘的動畫,可以使用下面的程式碼:

<scale
	android:fromXDelta="0"
        android:toXDelta="300"
	android:fromYDelta="0"
        android:toYDelta="300"
        android:duration="2000">
</scale>