【Android】Frame Animation(逐帧动画)

作者: 吾非言 | 来源:发表于2017-10-10 21:16 被阅读184次

    作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

    本文选自书客创作平台第17篇文章。阅读原文

    书客创作

    Frame Animation(帧动画/逐帧动画/Drawable Animation),顾名思义是指将画面一帧一帧的进行播放的动画,它有两种实现方式,第一种方式是通过Java代码实现,这里需要使用到AnimationDrawable。第二种方式XML进行实现,这里需要用到<animation-list>标签。

    第一种方式,Java实现:

    这里我在res/drawable下放置loading_01~loading_12张png文件,用来显示每帧的效果图。先要从该文件夹下取出Drawable最后通过anim.addFrame(drawable,100)添加进来即可,其中anim.setOneShot(false);这个方法是用来设置该动画效果是否为一次播放,true的时候表示播放一次就停止,false的时候表示可以联系播放。

    AnimationDrawable anim =new AnimationDrawable();
    for(int i =1; i <=12; i++) {
       int id;
       // 获取Drawable文件夹下的图片文件
       if(i <10)
          id = getResources().getIdentifier("loading_0"+ i,"drawable",getPackageName());
       else
          id = getResources().getIdentifier("loading_"+ i,"drawable",getPackageName());
       Drawable drawable = getResources().getDrawable(id);
       anim.addFrame(drawable,100);
    }
    anim.setOneShot(false);
    imageView.setImageDrawable(anim);
    

    第二种方式:XML进行实现。

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
       android:oneshot="false">
       <!--oneshot:是否只展示一遍-->
       <item android:drawable="@drawable/loading_01" android:duration="100"/>
       ......
       <item android:drawable="@drawable/loading_12" android:duration="100"/>
    </animation-list>
    
    

    这样就将该一个帧动画设置完成,然后只需要在XML布局文件中进行调用。

    <ImageView
       android:id="@+id/imageView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:contentDescription="@null"
       android:src="@drawable/loading"/>
    

    然而当我们运行的时候会发现动画没有运行而是停留在第一帧,这是为什么呢?

    那是因为AnimationDrawable播放动画是依附在window上面的,而在Activity onCreate方法中调用时Window还未初始化完毕,所有才会停留在第一帧,要想实现播放可以在onWindowFocusChanged或onCreate方法中添加如下代码:

    // XML实现逐帧动画
    imageView.setImageResource(R.drawable.loading);
    AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getDrawable();
    animationDrawable.start();
    

    补充:AnimationDrawable 几个常见的api。

    1. void start()- 开始播放动画
    2. void stop()- 停止播放动画
    3. addFrame(Drawable frame, int duration)- 添加一帧,并设置该帧显示的持续时间
    4. void setOneShoe(boolean flag)- false为循环播放,true为仅播放一次
    5. boolean isRunning()- 是否正在播放

    总结:逐帧动画使用起来较为简单,但是大量的使用,会占用大部分的CPU资源,是界面卡顿,而且如果画面使用图片过大时候还会出现OOM问题。

    GitHub地址
    阅读原文


    微信公众号:书客创作

    相关文章

      网友评论

        本文标题:【Android】Frame Animation(逐帧动画)

        本文链接:https://www.haomeiwen.com/subject/wgbbyxtx.html