Android - Drawable Animation
原文:http://developer.android.com/guide/topics/graphics/drawable-animation.html
XML 動畫資源檔
可以用 xml 像下面這樣來定義動畫,檔案放在 res/drawable
目錄下,這個範例中檔名叫做 rocket_thrust.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>
android:oneshot
為 true
時,動畫會從第一張影像開始播放一次,停在最後一張,若為 false
動畫會一直重複播放。
使用動畫資源檔
需要使用 ImageView
來顯示 Drawable 動畫、Drawable 動畫的類別叫做 AnimationDrawable
,要播放動畫要呼叫 AnimationDrawable.start()。
有兩種方法可以設定動畫:
ImageView.setBackgroundResource()
在 ImageView 直接把動畫資源設定好,AnimationDrawable,再用 getBackground() 拿出來。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.drawable.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);
}
ImageView.setImageDrawable()
這個方法需要多用一個 Resources
來取得 Drawable Resource 給 AnimationDrawable,再用 setImageDrawable() 設定給 ImageView。AnimationDrawable rocketAnimation;
Resources res;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
res = getResources();
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketAnimation = (AnimationDrawable) res.getDrawable(R.drawable.rocket_thrust);
rocketImage.setImageDrawable(rocketAnimation);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}
讓動畫在 Activity 載入時開始
上面兩種方法的最下面有個 onTouchEvent() 要點一下畫面才會呼叫 start() 開始播放動畫,如果要讓動畫在 Activity 一載入就開始播放,要用 onWindowFocusChanged()
當 Window 被 Focus 時就會動了(一般會想說在 OnCreate() 裡面呼叫 start(),但是這時候 AnimationDrawable 其實還沒載入到 Window,所以不能在這裡呼叫 start() )。@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
rocketAnimation.start();
}
在程式中建立 Drawable Animation
書上有提到可以用程式碼建立 Drawable Animation,把上面的範例直接改會變成下面這樣。AnimationDrawable rocketAnimation;
Resources res;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
res = getResources();
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
//--------------
rocketAnimation = new AnimationDrawable;
rocketAnimation.setOneShot(true);
rocketAnimation.addFrame(res.getDrawable(R.drawable.rocket_thrust1), 200);
rocketAnimation.addFrame(res.getDrawable(R.drawable.rocket_thrust2), 200);
rocketAnimation.addFrame(res.getDrawable(R.drawable.rocket_thrust3), 200);
//--------------
rocketImage.setImageDrawable(rocketAnimation);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}
變成直接把 AnimationDrawable new 出來,再把原本寫在 xml 裡面的東西設定給他。