Android学习笔记15:Frame Animation动画的实现
在Android中,动画Animation的实现有两种方式:Tween Animation(渐变动画)和Frame Animation(帧动画)。渐变动画是通过对场景里的对象不断做图像变换(平移、缩放、旋转等)产生动画效果。帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似。
帧动画主要是通过AnimationDrawable类来实现的。
1.AnimationDrawable类
AnimationDrawable类用于创建由一系列Drawable对象构成的逐帧动画对象,它可以作为一个视图对象的背景。
AnimationDrawable类的常用方法有以下一些:
mAnimationDrawable.addFrame(Drawable frame, int duration);//添加一个帧动画
mAnimationDrawable.getDuration(int i);//获得帧动画的时间
mAnimationDrawable.getFrame(int index);//获得指定索引的Drawable对象
mAnimationDrawable.getNumberOfFrames();//获得帧动画的总数
mAnimationDrawable.isOneShot();//帧动画是否只运行一次
mAnimationDrawable.isRunning();//帧动画是否处于运行状态
mAnimationDrawable.setOneShot(boolean onsShot);//设置帧动画是否只运行一次
mAnimationDrawable.setVisible(boolean visible, boolean restart);//设置帧动画是否可见
mAnimationDrawable.start();//运行帧动画
mAnimationDrawable.stop();//停止帧动画
2.通过Java代码实现Frame Animation动画
要实现Frame Animation动画,需要创建一个AnimationDrawable对象来表示Frame动画,然后通过addFrame()方法把每一帧要显示的内容添加进去,最后通过start()方法就可以播放动画了。
setOneShot()方法可以设置动画是否需要重复播放。
在具体实现中,需要预先准备了15张单帧动画图像,分别命名为image1到image15,并存放在工程的res/drawable目录下。然后可以通过如下方法将每一帧的图像加载到AnimationDrawable对象中。
加载单帧图像到AnimationDrawable对象中
1 mAnimationDrawable = new AnimationDrawable();
2 for (int i = 1; i <= 15; i++) {
3 int resourcesId = getResources().getIdentifier("image"+i, "drawable", mContext.getPackageName());
4 mDrawable = getResources().getDrawable(resourcesId);
5 mAnimationDrawable.addFrame(mDrawable, 500);
6 }
在本案例中,设置了按键事件监听,通过中键来启动动画,通过Back键来关闭动画(实际是通过关闭当前Activity来实现的)。
MainActivity.java源代码如下:
MainActivity.java源代码
1 package com.example.android_frameanimation;
2
3 import android.os.Bundle;
4 import android.view.KeyEvent;
5 import android.app.Activity;
6
7 public class MainActivity extends Activity {
8
9 FrameView mFrameView; //定义帧动画对象
10
11 @Override
12 public void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 mFrameView = new FrameView(this);
15 setContentView(mFrameView); //加载帧动画视图
16 }
17
18 //按键按下事件响应
19 public boolean onKeyDown(int keyCode, KeyEvent event)
20 {
21 if ( mFrameView == null )
22 {
23 return false;
24 }
25 if (keyCode == KeyEvent.KEYCODE_BACK) { //按下Back键结束当前Activity
26 this.finish();
27 return true;
28 }
29 mFrameView.onKeyDown(keyCode, event);
30 return true;
31 }
32 }
FrameView.java源代码如下:
FrameView.java源代码
1 package com.example.android_frameanimation;
2
3 import android.content.Context;
4 import android.graphics.Canvas;
5 import android.graphics.drawable.AnimationDrawable;
6 import android.graphics.drawable.Drawable;
7 import android.view.KeyEvent;
8 import android.view.View;
9
10 public class FrameView extends View {
11
12 AnimationDrawable mAnimationDrawable; //AnimationDrawable对象
13 Drawable mDrawable; //Drawable对象
14 Context mContext; //Context对象
15
16 public FrameView(Context context) {
17 super(context);
18 mContext = context;
19
20 //使用Java代码实现帧动画效果
21 mAnimationDrawable = new AnimationDrawable();
22 for (int i = 1; i <= 15; i++) {
23 int resourcesId = getResources().getIdentifier("image"+i, "drawable", mContext.getPackageName());
24 mDrawable = getResources().getDrawable(resourcesId);
25 mAnimationDrawable.addFrame(mDrawable, 500);
26 }
27 mAnimationDrawable.setOneShot(false);
28 this.setBackgroundDrawable(mAnimationDrawable);
29 }
30
31 public void onDraw(Canvas canvas) {
32 super.onDraw(canvas);
33 }
34
35 //按键按下事件响应
36 public boolean onKeyDown(int keyCode, KeyEvent event) {
37 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { //按下中键开始动画
38 mAnimationDrawable.start();
39 }
40  
补充:移动开发 , Android ,