在Android畫圖學習總結(四)——Animation(上)中,我們詳細介紹了Tween Aniamation,這裏我們將介紹另外一種動畫Frame Animation。在前面已經說過,Frame Animation是順序播放事先做好的圖像,跟電影類似。不同於animation package, Android SDK提供了另外一個類AnimationDrawable來定義、使用Frame Animation。
Frame Animation可以在XML Resource定義(還是存放到res\anim文件夾下),也可以使用AnimationDrawable中的API定義。由於Tween Animation與Frame Animation有着很大的不同,因此XML定義的格式也完全不一樣,其格式是:首先是animation-list根節點,animation-list根節點中包含多個item子節點,每個item節點定義一幀動畫:當前幀的drawable資源和當前幀持續的時間。下面對節點的元素加以說明:
XML屬性 | 說明 |
drawable | 當前幀引用的drawable資源 |
duration | 當前幀顯示的時間(毫秒爲單位) |
oneshot | 如果爲true,表示動畫只播放一次停止在最後一幀上,如果設置爲false表示動畫循環播放。 |
variablePadding | If true, allows the drawable’s padding to change based on the current state that is selected. |
visible | 規定drawable的初始可見性,默認爲flase; |
下面就給個具體的XML例子,來定義一幀一幀的動畫:
<animation-list xmlns:android=”http://schemas.android.com/apk/res/android”
android:oneshot=”true”>
<item android:drawable=”@drawable/rocket_thrust1″ android:duration=”200″ />
<item android:drawable=”@drawable/rocket_thrust2″ android:duration=”200″ />
<item android:drawable=”@drawable/rocket_thrust3″ android:duration=”200″ />
</animation-list>
上面的XML就定義了一個Frame Animation,其包含3幀動畫,3幀動畫中分別應用了drawable中的3張圖片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每幀動畫持續200毫秒。
然後我們將以上XML保存在res/anim/文件夾下,命名爲rocket_thrust.xml,顯示動畫的代碼,如下:在OnCreate()中增加如下代碼:
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.anim.rocket_thrust); rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
最後還需要增加啓動動畫的代碼:
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}
代碼運行的結果想必大家應該就知道了(3張圖片按照順序的播放一次),不過有一點需要強調的是:啓動Frame Animation動畫的代碼rocketAnimation.start();不能在OnCreate()中,因爲在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定,在OnCreate()中啓動動畫,就只能看到第一張圖片。
下面,閱讀Android SDK中對AnimationDrawable的介紹,有個簡單的瞭解:
AnimationDrawable | |
獲取、設置動畫的屬性 | |
int getDuration() | 獲取動畫的時長 |
int getNumberOfFrames() | 獲取動畫的幀數 |
boolean isOneShot() Void setOneShot(boolean oneshot) | 獲取oneshot屬性 設置oneshot屬性 |
void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) | |
增加、獲取幀動畫 | |
Drawable getFrame(int index) | 獲取某幀的Drawable資源 |
void addFrame(Drawable frame,int duration) | 爲當前動畫增加幀(資源,持續時長) |
動畫控制 | |
void start() | 開始動畫 |
void run() | 外界不能直接掉調用,使用start()替代 |
boolean isRunning() | 當前動畫是否在運行 |
void stop() | 停止當前動畫 |
Frame Animation的定義、使用比較簡單,在這裏已經詳細介紹完了,更加深入的學習還是到Android SDK去仔細瞭解吧,在Android SDK中也包含很多這方面的例子程序。