Android 逐帧动画( Drawable 动画),这一篇就够了

栏目: IOS · Android · 发布时间: 4年前

内容简介:作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像会动一样。大家明显可以看到这是一个动图,但是它并非一个 GIF 它是由八张单独的图片,间隔 200ms 连续播放所实现的效果。

前言

作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像会动一样。

实例,大家先看看效果

Android 逐帧动画( Drawable 动画),这一篇就够了

大家明显可以看到这是一个动图,但是它并非一个 GIF 它是由八张单独的图片,间隔 200ms 连续播放所实现的效果。

Android 逐帧动画( Drawable 动画),这一篇就够了

实现方法

这里我给大家介绍两种实现方法

  1. 在活动代码中添加实现
  2. 先生成 animation-list 的资源文件,再在活动中引用。

在代码中添加

在代码中添加顾名思义,就是将要播放的图片集合,一张一张的添加到一个 AnimationDrawable 对象中去,接着再将其添加到 imageView 中,调用 start() 方法便能开始播放。

注意:这里有个 OneShot() 方法,该方法用于设置是否需要循环播放,true为仅播放一次,false 为连续的循环播放。

imageView_2 = findViewById(R.id.image_2);
        AnimationDrawable animationDrawable1 = new AnimationDrawable();
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_1 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_2 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_3 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_4 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_5 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_6 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_7 ),200);
        animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_8 ),200);
        animationDrawable1.setOneShot(true);
        imageView_2.setImageDrawable(animationDrawable1);
        animationDrawable1.start();复制代码

引用资源文件方法

方法一有一个很严重的缺陷,就是每次要给控件添加这个动画时,都需要重新一步步的添加,但是有的时候,一套动画,我们可能需要在很多地方反复的使用到。

这时如果我们采用,将动画封装在一个资源文件中,在需要使用的时候能够像添加背景图一样简单的添加它:

步骤

  1. 在 /res/drawable 文件夹下建立一个名为 abunation_list.xml 的文件
  2. 在活动代码中,像添加图片资源一样的,为控件添加它
  3. 通过 getDrawable 方法,重空间中获得它并添加给 AnimationDrawable 对象
  4. 调用 start 方法开启动画

建立资源文件如下

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item
        android:drawable="@drawable/iron_1"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_2"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_3"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_4"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_5"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_6"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_7"
        android:duration="200"/>
    <item
        android:drawable="@drawable/iron_8"
        android:duration="200"/>
</animation-list>
复制代码

将其添加到 ImageView 中

imageView_1 = findViewById(R.id.image_1);
        imageView_1.setImageResource(R.drawable.abunation_list);
        AnimationDrawable animationDrawable = (AnimationDrawable) imageView_1.getDrawable();
        animationDrawable.start();复制代码

注意事项

在使用帧动画时,这里有几个要点需要大家记住:

其一、 在我的范例代码中,大家可以看到,是直接在 imageView 对象执行过 findViewById 后就添加了的,但是这样会导致一个严重的问题,对于一些手机而言,如果 onCreate 方法没有执行完,imageView 对象就不会真正的实例化出来,这就到导致空指针异常(NullPointException)。正确的使用方法,根据活动的运行周期,我们应该在 onResume 方法中添加它,这样就保证了所有的控件都被实例化出来,

其二、 对与帧动画,我们不建议添加太大的图片,因为这很容易导致 OOM,建议大家用 Drawable 动画,去做一些类似,加载动画,WiFi 链接动画这样,占有内存比较小的操作。

项目 Demo :

点击跳转

由于以上都是我自己的理解,如果有误,欢迎大家在评论区留言,谢谢 :pray:


以上所述就是小编给大家介绍的《Android 逐帧动画( Drawable 动画),这一篇就够了》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出程序设计(中文版)

深入浅出程序设计(中文版)

Paul Barry、David Griffiths / 蒋雁翔、童健 / 东南大学出版社 / 2012-1 / 98.00元

《深入浅出程序设计(中文版)》介绍了编写计算机程序的核心概念:变量、判断、循环、函数与对象——无论运用哪种编程语言,都能在动态且多用途的python语言中使用具体示例和练习来运用并巩固这些概念。学习基本的工具来开始编写你感兴趣的程序,而不是其他人认为你应该使用的通用软件,并对软件能做什么(不能做什么)有一个更好的了解。当你完成这些,你就拥有了必要的基础去使用任何一种你需要或想要学习的语言或软件项目......一起来看看 《深入浅出程序设计(中文版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换