AnimationDrawable 帧动画 爆炸特效

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


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();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AnimationDrawable是一个用于实现动画的类。它允许您将多张图片以特定的顺序显示在屏幕上,从而创建连续的动画效果。 要使用AnimationDrawable,首先需要在XML或Java代码中定义一个AnimationDrawable对象,并将每一图片添加到其中。然后,您可以通过调用start()方法启动动画,或者通过调用stop()方法停止动画。 以下是一个使用AnimationDrawable创建动画的示例: 1. 在XML文件中定义AnimationDrawable对象和每一图片: ```xml <animation-list android:id="@+id/animation" android:oneshot="false"> <item android:drawable="@drawable/frame1" android:duration="100"/> <item android:drawable="@drawable/frame2" android:duration="100"/> <item android:drawable="@drawable/frame3" android:duration="100"/> <!-- 添加更多的图片 --> </animation-list> ``` 2. 在Java代码中获取AnimationDrawable对象,并将其应用到ImageView上: ```java ImageView imageView = findViewById(R.id.imageView); AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); ``` 3. 启动动画: ```java animationDrawable.start(); ``` 这样,您就可以在ImageView上显示动画了。每一图片将按照指定的持续时间进行切换,从而呈现出动画效果。 请注意,AnimationDrawable可以通过调用stop()方法停止动画。此外,您还可以设置动画是否循环播放,通过将android:oneshot属性设置为true或false来实现。 希望这个例子能够帮助您理解如何使用AnimationDrawable创建动画!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值