Android 动画系列之逐帧(Frame)动画详解

时间:2022-09-11 08:56:35

前言

前段时间太忙了,已经好久没发博客了,好多想写的东西都没时间写,想了想,这个星期就抽时间写一个动画合集吧,把Android中用到的动画做一个大合集。

这一篇就先写Android中最简单也最容易理解的动画:逐帧(Frame)动画吧。逐帧动画是通过一张一张的图片,切换形成的动画,就类似与我们看的胶片电影一样,逐帧动画最简单的使用就是在xml文件中定义要播放的图片文件并设置好时长,然后在代码中获取并播放。下面以一个播放语音的动画小例子来演示一下具体使用。

使用

定义XML文件

在res/drawable/目录下新建一个动画文件,根节点选择animation-list。这里可能有人很好奇,为什么动画文件不是在anim目录下而是在drawable目录下呢?其实逐帧动画对应的类是:AnimationDrawable其父类就是一个Drawable对象。

<?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/ic_sound1" android:duration="300" />
    <item  android:drawable="@drawable/ic_sound2" android:duration="300" />
    <item  android:drawable="@drawable/ic_sound3" android:duration="300" />

</animation-list>

其中drawable属性就是对应的图片资源,建议将图片放在drawable目录下,以免出现错误。
oneshot :true 播放一次 false 循环播放

代码中启动动画

mSoundView.setImageDrawable(getResources().getDrawable(R.drawable.frame));
mAnim = (AnimationDrawable) mSoundView.getDrawable();
mAnim.start();

我们也可以直接给ImageView设置动画文件为背景,然后直接获取AnimationDrawable再start就可以了。

运行结果:
Android 动画系列之逐帧(Frame)动画详解

除了用上面的在xml中定义帧动画文件外,我们也可以通过AnimationDrawable对象的addFrame()方法在代码中添加。
另外,AnimationDrawable还有如下方法:

JAVA方法 解释
addFrame(Drawable frame, int duration) 添加一个帧动画
getDuration(int i) 获取角标对应持续时间
getFrame(int index) 获取角标对应帧动画
getNumberOfFrames() 获取帧的动画数(放三张图片返回就是3)
isOneShot() 是否只播放一次
setOneShot(boolean oneShot) 设置是否只播放一次
isRunning() 是否正在运行