逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样,通过XML或者Java代码均可实现。
AnimationDrawable 几个常见的api
•void start() - 开始播放动画
•void stop() - 停止播放动画
•addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间
•void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次
•boolean isRunning() - 是否正在播放
(1)XML 资源文件方式实现:首先在drawable中放入如下xml动画效果,文件名demo_animlist.xml。
<?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/xxx_1"
android:duration="300" />
<item
android:drawable="@drawable/xxx_2"
android:duration="300" />
<item
android:drawable="@drawable/xxx_3"
android:duration="300" />
<item
android:drawable="@drawable/xxx_4"
android:duration="300" />
<item
android:drawable="@drawable/xxx_5"
android:duration="300" />
<item
android:drawable="@drawable/xxx_6"
android:duration="300" />
</animation-list>
animation-list为根节点,里面包含一个或者多个item,每个item为一个动画帧,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。其中oneshot用来控制播放次数,true表示只会播放一次,false表示一直循环播放。
定义好上述动画文件后,将其在代码中需要使用的位置引入,例如:
<ImageView
android:id="@+id/animation_frame_by_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src="@drawable/demo_animlist" />
此时我们运行代码,会发现动画停留在第一帧,并没有出现预期的动画效果,那是因为AnimationDrawable播放动画是依附在window上面的,而在Activity onCreate方法中调用时Window还未初始化完毕,所有才会停留在第一帧,要想实现此动画效果必须在onWindowFocusChanged中添加如下代码:
imageView.setImageResource(R.drawable.animation_frame_by_frame);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
animationDrawable.start();
如果需要停止动画需要调用
animationDrawable.stop();
(2)Java代码实现
AnimationDrawable anim = new AnimationDrawable();
for (int i = 1; i <= 6; i++) {
int id = getResources().getIdentifier("xxx_" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
anim.addFrame(drawable, 300);
}
anim.setOneShot(false);
imageView.setImageDrawable(anim);
anim.start();
Frame Animation(逐帧动画)相对来说比较简单,但是在实际开发中使用的频率还是比较高的。希望以这个小例子能够掌握逐帧动画,但是逐帧动画只能实现比较小的动画效果,如果复杂而且帧数比较多的动画不太建议使用逐帧动画,一方面是因为会造成OOM,另一方面会显得很卡,如果真是超级复杂的动画的话建议选择双缓冲绘制View来实现。