動畫分為逐幀動畫(Frame)、補間動畫(Tween) 和屬性動畫。
1、逐幀動畫
通常採用XML資源檔進行定義,如下:
android:oneshot 設定是否迴圈播放動畫,false為迴圈播放為預設的設定,xml檔案定義幀動畫資源,在程式中用一個ImageView就可以顯示該動畫了。
需要指出的是AnimationDrawable代表的動畫預設是不播放的,需要在程式中啟動,調用start() 和 stop() .
子彈爆炸效果執行個體
import java.lang.reflect.Field;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.AnimationDrawable;import android.media.MediaPlayer;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.FrameLayout;import android.widget.ImageView;public class Blast extends Activity{private MyView myView;private AnimationDrawable anim;private MediaPlayer bomb;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 使用FrameLayout布局管理器,它允許組件自己控制位置FrameLayout frame = new FrameLayout(this);setContentView(frame);// 設定使用背景frame.setBackgroundResource(R.drawable.back);// 載入音效bomb = MediaPlayer.create(this, R.raw.bomb);myView = new MyView(this);// 設定myView用於顯示blast動畫myView.setBackgroundResource(R.anim.blast);// 設定myView預設為隱藏myView.setVisibility(View.INVISIBLE);// 擷取動畫對象anim = (AnimationDrawable) myView.getBackground();frame.addView(myView);frame.setOnTouchListener(new OnTouchListener(){public boolean onTouch(View source, MotionEvent event){// 只處理按下事件(避免每次產生兩個動畫效果)if (event.getAction() == MotionEvent.ACTION_DOWN){// 先停止動畫播放anim.stop();float x = event.getX();float y = event.getY();// 控制myView的顯示位置myView.setLocation((int) y - 40, (int) x - 20);myView.setVisibility(View.VISIBLE);// 啟動動畫anim.start();// 播放音效bomb.start();}return false;}});}// 定義一個自訂View,該自訂View用於播放“爆炸”效果class MyView extends ImageView{public MyView(Context context){super(context);}// 定義一個方法,該方法用於控制MyView的顯示位置public void setLocation(int top, int left){this.setFrame(left, top, left + 40, top + 40);}// 重寫該方法,控制如果動畫播放至最後一幀時,隱藏該Viewprotected void onDraw(Canvas canvas) {try{Field field = AnimationDrawable.class.getDeclaredField("mCurFrame");field.setAccessible(true);// 擷取anim動畫的當前幀int curFrame = field.getInt(anim);// 如果已經到了最後一幀if (curFrame == anim.getNumberOfFrames() - 1){// 讓該View隱藏setVisibility(View.INVISIBLE);}}catch (Exception e){}super.onDraw(canvas);}}}blast.xml