欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 动画系列二 逐帧动画(FrameAnimation)

程序员文章站 2022-03-28 15:06:08
...

一、概述

逐帧动画是一种常见的动画形式,其原来将动画拆分为 帧 的形式,且定义每一帧 = 每一张图片,按序播放一组预先定义好的图片。

二、相关属性

在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