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>
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 shape corners 设置无效的解决
- Android OpenGL ES :材质渲染
- Android开发代码规范
- Android OpenGL ES正方体纹理贴图(每个面一张)
- Android应用性能测试
- mono for android学习过程系列教程(2)
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Android中的基本控件(上)--按钮控件Button
- Android OpenGL ES顶点坐标、纹理贴图坐标设置
- 从零开始学android<CheckBox多选按钮的使用.八.>
- Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- android应用开发——android存储之SharedPreferences
- android之expandableListView+BaseExpandableListAdapter+ArrayList伸缩的用法:
- 笔记14--android中Shape、Selector
- Android学习笔记(1)
- android之surfaceView
- winxp下j2me环境,android,nokiaSdk的配置
- android 点击事件 按钮事件