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 裡面的東西設定給他。
