Android学习之逐帧动画

动画分为逐帧动画(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>



Android学习之逐帧动画,布布扣,bubuko.com

Android学习之逐帧动画

上一篇:Android中的基本控件(上)--按钮控件Button


下一篇:Android Canvas练习(4)自已绘折线图