动画分为逐帧动画(Frame)、补间动画(Tween) 和属性动画。
1、逐帧动画
通常采用XML资源文件进行定义,如下:
android:oneshot 设置是否循环播放动画,false为循环播放为默认的设置,xml文件定义帧动画资源,在程序中用一个ImageView就可以显示该动画了。
需要指出的是AnimationDrawable代表的动画默认是不播放的,需要在程序中启动,调用start() 和 stop() .
<?xml version="1.0" encoding="utf-8"?> <!-- 指定动画循环播放 --> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!-- 添加多个帧 --> <item android:drawable="@drawable/fat_po_f01" android:duration="60" /> <item android:drawable="@drawable/fat_po_f02" android:duration="60" /> <item android:drawable="@drawable/fat_po_f03" android:duration="60" /> <item android:drawable="@drawable/fat_po_f04" android:duration="60" /> <item android:drawable="@drawable/fat_po_f05" android:duration="60" /> </animation-list>
子弹爆炸效果实例
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); } // 重写该方法,控制如果动画播放到最后一帧时,隐藏该View 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); } } }blast.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 定义动画只播放一次,不循环 --> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/bom_f01" android:duration="80" /> <item android:drawable="@drawable/bom_f02" android:duration="80" /> <item android:drawable="@drawable/bom_f03" android:duration="80" /> <item android:drawable="@drawable/bom_f04" android:duration="80" /> <item android:drawable="@drawable/bom_f05" android:duration="80" /> <item android:drawable="@drawable/bom_f06" android:duration="80" /> <item android:drawable="@drawable/bom_f07" android:duration="80" /> <item android:drawable="@drawable/bom_f08" android:duration="80" /> <item android:drawable="@drawable/bom_f09" android:duration="80" /> <item android:drawable="@drawable/bom_f10" android:duration="80" /> <item android:drawable="@drawable/bom_f11" android:duration="80" /> <item android:drawable="@drawable/bom_f12" android:duration="80" /> <item android:drawable="@drawable/bom_f13" android:duration="80" /> <item android:drawable="@drawable/bom_f14" android:duration="80" /> <item android:drawable="@drawable/bom_f15" android:duration="80" /> <item android:drawable="@drawable/bom_f16" android:duration="80" /> <item android:drawable="@drawable/bom_f16" android:duration="80" /> <item android:drawable="@drawable/bom_f17" android:duration="80" /> <item android:drawable="@drawable/bom_f18" android:duration="80" /> <item android:drawable="@drawable/bom_f19" android:duration="80" /> <item android:drawable="@drawable/bom_f20" android:duration="80" /> <item android:drawable="@drawable/bom_f21" android:duration="80" /> <item android:drawable="@drawable/bom_f22" android:duration="80" /> <item android:drawable="@drawable/bom_f23" android:duration="80" /> <item android:drawable="@drawable/bom_f24" android:duration="80" /> <item android:drawable="@drawable/bom_f25" android:duration="80" /> <item android:drawable="@drawable/bom_f26" android:duration="80" /> <item android:drawable="@drawable/bom_f27" android:duration="80" /> </animation-list>