您的位置:首页 > 移动开发 > Android开发

Android学习之逐帧动画

2014-04-07 21:36 357 查看
动画分为逐帧动画(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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: