文章目錄
  1. 1. XML 動畫資源檔
  2. 2. 使用動畫資源檔
    1. 2.1. ImageView.setBackgroundResource()
    2. 2.2. ImageView.setImageDrawable()
    3. 2.3. 讓動畫在 Activity 載入時開始
  3. 3. 在程式中建立 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:oneshottrue 時,動畫會從第一張影像開始播放一次,停在最後一張,若為 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 裡面的東西設定給他。

文章目錄
  1. 1. XML 動畫資源檔
  2. 2. 使用動畫資源檔
    1. 2.1. ImageView.setBackgroundResource()
    2. 2.2. ImageView.setImageDrawable()
    3. 2.3. 讓動畫在 Activity 載入時開始
  3. 3. 在程式中建立 Drawable Animation