一、概述
逐帧动画是一种常见的动画形式,其原来将动画拆分为 帧 的形式,且定义每一帧 = 每一张图片,按序播放一组预先定义好的图片。
二、相关属性
在Android中逐帧动画需要得到AnimationDrawable类的支持是Drawable的间接子类。它主要用来创建一个逐帧动画,并且可以对帧进行拉伸,把它设置为View的背景即可使用AnimationDrawable.start()方法播放。既然逐帧动画是需要播放一帧一帧的图像,所以需要为其添加帧。在Android中提供了两种方式为AnimationDrawable添加帧:XML定义的资源文件和Java代码创建,后面再详细讲讲这两种添加帧的方式。下面简单介绍一下AnimationDrawable操作逐帧动画常用方法:
java方法 | 说明 |
---|---|
start() | 开始播放逐帧动画 |
stop() | 停止播放逐帧动画 |
addFrame(Drawable frame,int duration) | 为AnimationDrawable添加一帧,并设置持续时间 |
int getDuration(int i) | 得到指定index的帧的持续时间 |
Drawable getFrame(int index) | 得到指定index的帧Drawable |
int getNumberOfFrames() | 得到当前AnimationDrawable的所有帧数量 |
boolean isOneShot() | 当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放 |
boolean isRunning() | 当前AnimationDrawable是否正在播放 |
void setOneShot(boolean oneShot) | 设置AnimationDrawable是否执行一次,true执行一次,false循环播放 |
xml | 说明 |
---|---|
android:oneshot | true执行一次,false循环播放默认false |
android:duration | 每帧播放的实际 |
三、使用方法
3-1 使用XML定义的资源文件设置动画帧
Android下所有的资源文件均要放在/res目录下,对于动画帧的资源需要当成一个Drawable,所以需要把它放在/res/Drawable目录下。而定义逐帧动画非常简单,只要在<animation-list.../>元素中使用<item.../>子元素定义动画的全部帧,并制定各帧的持续时间即可。还可以在<animation-list.../>元素中添加属性,来设定逐帧动画的属性。
代码示例
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">//设置只播放一次,默认false
<item android:drawable="@drawable/zf0" android:duration="200"/>
<item android:drawable="@drawable/zf1" android:duration="200"/>
<item android:drawable="@drawable/zf2" android:duration="200"/>
<item android:drawable="@drawable/zf3" android:duration="200"/>
<item android:drawable="@drawable/zf4" android:duration="200"/>
<item android:drawable="@drawable/zf5" android:duration="200"/>
<item android:drawable="@drawable/zf6" android:duration="200"/>
<item android:drawable="@drawable/zf7" android:duration="200"/>
<item android:drawable="@drawable/zf8" android:duration="200"/>
<item android:drawable="@drawable/zf9" android:duration="200"/>
</animation-list>
java代码中使用方法
//通过设置背景进行帧动画播放
TextView tv_gy = findViewById(R.id.tv_gy);
AnimationDrawable gyDrawable = (AnimationDrawable) tv_gy.getBackground();
gyDrawable.start();
//通过图片设置
ImageView iv_hz = findViewById(R.id.img_hz);
iv_hz.setImageResource(R.drawable.hongzhong_anim);
AnimationDrawable hzDrawable = (AnimationDrawable) iv_hz.getDrawable();
hzDrawable.start();
3-2 使用Java代码创建逐帧动画
通过AnimationDrawable.addFrame()方法为AnimationDrawable添加动画帧,上面已经提供了addFrame()的方法签名,它可以设置添加动画帧的Drawable和持续时间
代码示例
AnimationDrawable zfDrawable = new AnimationDrawable();
for (int i = 0; i <= 9; i++) {
int id = getResources().getIdentifier("zf" + i, "drawable", FrameAnimaActivity.this.getPackageName());
Drawable drawable = getResources().getDrawable(id);
zfDrawable.addFrame(drawable, 100);
}
btn_zf.setBackgroundDrawable(zfDrawable);
zfDrawable.start();
四、特点
- 优点:使用简单、方便
- 缺点:容易引起 OOM,因为会使用大量 尺寸较大的图片资源,所以一定要尽量避免使用尺寸较大的图片
五、应用场景
较为复杂的个性化动画效果
注意事项:使用时一定要避免使用尺寸较大的图片,否则会引起OOM
网友评论