逐帧动画,在指定点播放爆炸动画

可根据喜好,将爆炸动画效果,换成自己想要的动画效果

public class MainActivity 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 View.OnTouchListener()
        {
            @Override
            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 - 100, (int) x - 100);
                    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 + 200, top + 200); //设置该view在窗口中的位置及大小用于显示动画
        }
        // 重写该方法,控制如果动画播放到最后一帧时,隐藏该View
        @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)
                {
                    // 让该View隐藏
                    setVisibility(View.INVISIBLE); //也可以设置动画只有播放一次,然后最后一帧用透明的图片,就相当于隐藏了
                }
            }
            catch (Exception e)
            {
            }
            super.onDraw(canvas);
        }
    }
}



猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/80048836