Android动画——逐帧动画(Frame Animation)

逐帧动画(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。


<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来实现。

你可能感兴趣的:(Android技术总结)