前言
前段时间太忙了,已经好久没发博客了,好多想写的东西都没时间写,想了想,这个星期就抽时间写一个动画合集吧,把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就可以了。
运行结果:
除了用上面的在xml中定义帧动画文件外,我们也可以通过AnimationDrawable对象的addFrame()方法在代码中添加。
另外,AnimationDrawable还有如下方法:
JAVA方法 | 解释 |
---|---|
addFrame(Drawable frame, int duration) | 添加一个帧动画 |
getDuration(int i) | 获取角标对应持续时间 |
getFrame(int index) | 获取角标对应帧动画 |
getNumberOfFrames() | 获取帧的动画数(放三张图片返回就是3) |
isOneShot() | 是否只播放一次 |
setOneShot(boolean oneShot) | 设置是否只播放一次 |
isRunning() | 是否正在运行 |