逐帧动画(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来实现。
新闻热点
疑难解答