该程序只是简单的检测到触摸屏幕事件,当用户触屏时,程序将会在触摸到”爆炸”.
package com.test.frameanimation;
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.widget.FrameLayout;
import android.widget.ImageView;
import java.lang.reflect.Field;
/**
* 定义爆炸的逐帧动画
*/
public class BlastActivity extends Activity {
private MyView mMyView;
private AnimationDrawable anim;
private MediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_blast);
//使用 FrameLayout 布局管理器,它允许组件控制自己的位置
FrameLayout frame = new FrameLayout(this);
setContentView(frame);
//设置背景图
frame.setBackgroundResource(R.drawable.back);
//加载音效
mPlayer = MediaPlayer.create(this, R.raw.bomb);
mMyView = new MyView(this);
//设置myview 显示动画
mMyView.setBackgroundResource(R.anim.blast);
//设置MyView 默认是隐藏
mMyView.setVisibility(View.INVISIBLE);
//获取动画对象
anim = (AnimationDrawable) mMyView.getBackground();
frame.addView(mMyView);
frame.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//处理按下事件
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 先停止动画播放
anim.stop();
float x = event.getX();
float y = event.getY();
//控制 MyView的显示位置
mMyView.setLocation((int) y - 40, (int) x - 20);
mMyView.setVisibility(View.VISIBLE);
anim.start();
mPlayer.start();
}
return false;
}
});
}
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); //TODO
}
@Override
protected 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){
setVisibility(View.INVISIBLE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}