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>
时间: 2024-09-19 23:54:38

Android学习之逐帧动画的相关文章

Android动画之逐帧动画(Frame Animation)基础学习_Android

前言 在Android中,动画Animation的实现有两种方式:Tween Animation(补间动画)和Frame Animation(帧动画).渐变动画是通过对场景里的对象不断做图像变换(平移.缩放.旋转等)产生动画效果.帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似. 下面我们就来学习下Android中逐帧动画的基础知识. 原理 : 人眼的"视觉暂留" 方式 :      1.在java代码中 ( new AnimationDrawable().addFra

Android动画之逐帧动画(Frame Animation)基础学习

前言 在Android中,动画Animation的实现有两种方式:Tween Animation(补间动画)和Frame Animation(帧动画).渐变动画是通过对场景里的对象不断做图像变换(平移.缩放.旋转等)产生动画效果.帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似. 下面我们就来学习下Android中逐帧动画的基础知识. 原理 : 人眼的"视觉暂留" 方式 : 1.在java代码中 ( new AnimationDrawable().addFrame(ge

Android动画之逐帧动画(Frame Animation)实例详解_Android

本文实例分析了Android动画之逐帧动画.分享给大家供大家参考,具体如下: 在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现. 如果被定义在XML文件中,我们可以放置在/res下的anim或drawable目录中(/res/[anim | drawable]/filename.xml),文件名可以作为资源ID在代码中引用:如果由完全由编码实现,我

Android动画之逐帧动画(Frame Animation)实例详解

本文实例分析了Android动画之逐帧动画.分享给大家供大家参考,具体如下: 在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现. 如果被定义在XML文件中,我们可以放置在/res下的anim或drawable目录中(/res/[anim | drawable]/filename.xml),文件名可以作为资源ID在代码中引用:如果由完全由编码实现,我

Android 逐帧动画创建实例详解

Android 逐帧动画创建实例详解 前言: 我们看早期电影的时候,电影通常是一张一张播放,用我们现在专有名词来说,就是一帧帧来,安卓同样有这样动画效果的编排形式. 那么我们先定义逐帧动画xml文件 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" an

Flash动画制作技巧之如何掌握逐帧动画

flash动画|技巧 问题:逐帧动画与移动渐变动画,形状渐变动画有什么区别? 解决思路 在本例中详细地解释了逐帧动画的特点和与其他形式动画的区别.逐帧动画,顾名思义就是把运动过程附加在每个帧中,当影格快速移动的时候,利用人的视觉的残留现象,形成流畅的动画效果. 具体步骤 1.运行Flash MX 2004,文档属性默认. 2.单击第1帧,利用椭圆形工具在舞台的左侧画一个红颜色无边框的圆. 3.单击第1帧,按快捷键"F6"键,连续在时间轴上插入10个关键帧.如图2.1.51所示. 图2.

Fireworks制作图片变换效果逐帧动画

细节性的动画在FW里还是使用逐帧动画调节起来比较细腻,虽然使用动画元件比较快,但是我还是比较喜欢一帧一帧的调,做了几个图片变换过渡的效果: ① 逐帧动画: PNG文件: ② 逐帧+蒙板: PNG文件: ③ 逐帧+不透明度做的图片过渡: PNG文件: ④ 逐帧+灰度蒙板做的图片过渡: PNG文件:

Fireworks逐帧动画效果及实例剖析

细节性的动画在FW里还是使用逐帧动画调节起来比较细腻,虽然使用动画元件比较快,但是我还是比较喜欢一帧一帧的调,做了几个图片变换过渡的效果: ① 逐帧动画: PNG文件: ② 逐帧+蒙板: PNG文件: ③ 逐帧+不透明度做的图片过渡: PNG文件: ④ 逐帧+灰度蒙板做的图片过渡: PNG文件:

flash8.0逐帧动画详解及实例

从本单元起,我们将逐渐给大家介绍Flash8.0中的五种常见的动画形式:逐帧动画.形状补间动画.动作补间动画.遮罩动画.引导线动画. 本节着重介绍逐帧动画(FrameBy Frame),这是一种常见的动画手法,它的原理是在"连续的关键帧"中分解动画动作,也就是每一帧中的内容不同,连续播放而成动画. 由于逐帧动画的帧序列内容不一样,不仅增加制作负担而且最终输出的文件量也很大,但它的优势也很明显:因为它相似与电影播放模式,很适合于表演很细腻的动画,如3D效果.人物或动物急剧转身等等效果.