AnimationDrawable 帧动画 爆炸特效

本文介绍了一个简单的Android应用程序,该程序能够在用户触摸屏幕时触发爆炸动画效果,并伴有声音反馈。通过自定义视图和逐帧动画实现,同时利用了触摸监听器来定位动画位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该程序只是简单的检测到触摸屏幕事件,当用户触屏时,程序将会在触摸到”爆炸”.


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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值