Android动画之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         return true;
41     }
42 }

3.通过xml布局文件实现Frame Animation动画

  逐帧动画的实现,也可以通过xml布局文件来完成。xml文件可以存放在工程的res/anim目录下。

  Frame动画的xml文件常用属性如下:

android:drawable[drawable]//加载Drawable对象

android:duration[long]//每一帧动画的持续时间(单位ms)

android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

android:visible[boolean]//Drawable对象的初始能见度状态,true可见,false不可见(默认为false)

  使用xml来实现Frame动画时,首先可以通过setBackgroundResource()方法来加载xml动画布局文件,然后通过getBackground()方法获得动画,再通过setBackgroundDrawable()方法设置要显示的动画,最后通过start()方法来播放动画即可。

  具体实现只需将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 import android.widget.ImageView;
10
11 public class FrameView extends View {
12
13     AnimationDrawable mAnimationDrawable;   //AnimationDrawable对象
14     Drawable mDrawable;              //Drawable对象
15     Context mContext;                      //Context对象
16
17     public FrameView(Context context) {
18         super(context);
19         mContext = context;
20
21         //使用xml文件实现帧动画效果
22         ImageView mImageView = new ImageView(mContext);
23         mImageView.setBackgroundResource(R.anim.frameanimation);
24         mAnimationDrawable = (AnimationDrawable) mImageView.getBackground();
25         this.setBackgroundDrawable(mAnimationDrawable);
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         return true;
41     }
42 }

  此外,还需要补充一个frameanimation.xml文件,具体源代码如下:

frameanimation.xml源代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <animation-list
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:oneshot="false"    >
 5     <item android:drawable="@drawable/image1"    android:duration="1000"    />
 6     <item android:drawable="@drawable/image2"    android:duration="1000"    />
 7     <item android:drawable="@drawable/image3"    android:duration="1000"    />
 8     <item android:drawable="@drawable/image4"    android:duration="1000"    />
 9     <item android:drawable="@drawable/image5"    android:duration="1000"    />
10     <item android:drawable="@drawable/image6"    android:duration="1000"    />
11     <item android:drawable="@drawable/image7"    android:duration="1000"    />
12     <item android:drawable="@drawable/image8"    android:duration="1000"    />
13     <item android:drawable="@drawable/image9"    android:duration="1000"    />
14     <item android:drawable="@drawable/image10"    android:duration="1000"    />
15     <item android:drawable="@drawable/image11"    android:duration="1000"    />
16     <item android:drawable="@drawable/image12"    android:duration="1000"    />
17     <item android:drawable="@drawable/image13"    android:duration="1000"    />
18     <item android:drawable="@drawable/image14"    android:duration="1000"    />
19     <item android:drawable="@drawable/image15"    android:duration="1000"    />
20
21 </animation-list>

时间: 2024-11-19 14:38:45

Android动画之Frame Animation的相关文章

详解Android动画之Frame Animation(转)

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

Android动画学习——Tween Animation

目录 目录 Android动画学习 Tween Animation scale动画调节尺寸 alpha动画调节透明度 rotate动画旋转 translate动画平移 Android动画学习 android中动画分为3种: Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生的动画效果,即是一种渐变动画. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画. Property Animation:属性动画,通过动态地改变对象的属性从而达

【Android 动画】View Animation详解(一)

安卓平台目前提供了两大类动画,在Android 3.0之前,一大类是View Animation,包括Tween animation(补间动画),Frame animation(帧动画),在android3.0中又引入了一个新的动画系统:property animation,即属性动画.本篇文章主要介绍View Animation的基本使用方法与技巧,属性动画将在下一篇博文中介绍. Tween动画可以执行一系列简单变换(位置,大小,旋转,缩放和透明度).所以,如果你有一个TextView对象,您

Android动画介绍-Tween Animation

3.0以前,android支持两种动画模式,Tween Animation,Frame Animation 在android3.0中又引入了一个新的动画系统:Property Animation 这三种动画模式在SDK中被称为Property Animation,View Animation,Drawable Animation 下面介绍:Tween Animation View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间

android中的动画之变换动画(Tween Animation)

android中有四大动画,它们分别是:变换动画(Tween Animation),帧动画(frame Animation),布局动画(layout Animation),属性动画(Property Animation ).今天我在这里简单的说下变换动画. 首先我们来说下animation种的那些属性(这些都是动画中的通用属性) xml属性 java方法 解释 android:detachWallpaper setDetachWallpaper(booean) 是否在在壁纸上运行 android

Android应用资源---动画资源(Animation Resources)

有两种类型的动画资源: 属性动画 在设定的时间内,通过修改与Animator类相关的对象的属性值来创建一个动画. 视图动画 有两种类型的视图动画框架 补间动画(Tween animation):通过执行通过执行一系列的与Animation类相关的单一图片的转换来创建动画. 帧动画(Frame animation):通过显示与AnimationDrawable类的顺序相关的图片序列来创建动画. 属性动画 动画被定义在要修改的目标对象属性的XML中,如设定时间内的背景色或alpha值. 文件位置(F

安卓突击:Android 动画有哪几种?

Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即是一种渐变动画: Frame Animation:顺序播放事先做好的图像,是一种画面转换动画. 一 Tween Animation Tween Animation有四种形式: l  alpha              渐变透明度动画效果 l  scale                渐变尺寸伸缩动画效果 l  translate            画面位置移动动画效果 l  rotate 

Android动画效果之Frame Animation(逐帧动画)(二)(

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). Frame Animation(逐帧动画): 逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样.和补间动画一样可以通过xml实现也可以通过java代码实现.接下来借助目前项目中的一个开奖的动画来总结

Android动画效果之Frame Animation(逐帧动画)

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). 其他几种动画效果: Android动画效果之Tween Animation(补间动画) Android动画效果之Frame Animation(逐帧动画) Android动画效果之初识Property Animation(属性动画) Android动画效果之Prop