http://hi.baidu.com/baibaixiaoyao/blog/item/5c9e92529b759c1d0cf3e3b0.html
[不完全轉載,原文:http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.html]
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; |
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() | 停止目前動畫 |
下面就給個具體的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,顯示動畫的代碼:
AnimationDrawable rocketAnimation;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
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()中啟動動畫,就隻能看到第一張圖檔。這裡實在拖曳事件中實作的。(這裡現在main.xml裡定義一個ImageView,可以先不指定src,運作時會自動綁定)
下面,閱讀Android SDK中對AnimationDrawable的介紹,有個簡單的了解: