前言

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

实例,大家先看看效果

​

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

​


实现方法

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

  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 :

点击跳转

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

Android 逐帧动画( Drawable 动画),这一篇就够了的更多相关文章

  1. Android 逐帧动画

    原理: 逐帧动画是最简单的一种动画.原理就是把几张图片连续显示出来,以达到动画的效果.就相当于下面这种手绘翻页动画啦~ 实现: 1.需要建立一个animation-list来设置静态图片资源.持续时间 ...

  2. Android 逐帧动画isRunning 一直返回true的问题

    AnimationDrawabl主要通过xml实现逐帧动画,SDK实例如下: An AnimationDrawable defined in XML consists of a single < ...

  3. Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

  4. 第三部分:Android 应用程序接口指南---第四节:动画和图形---第一章 属性动画及动画与图形概述

    第1章 属性动画及动画与图形概述 Android提供了一系列强大的API来把动画加到UI元素中,以及绘制自定义的2D和3D图像中去.下面的几节将综述这些可用的API以及系统的功能,同时帮你做出最优的选 ...

  5. Android(java)学习笔记198:Android下的逐帧动画(Drawable Animation)

    1.帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧 ...

  6. Android(java)学习笔记141:Android下的逐帧动画(Drawable Animation)

    1. 帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一 ...

  7. Android动画效果之Frame Animation(逐帧动画)

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  8. Android开发教程AnimationDrawable逐帧播放动画

    下面我们一起来看篇Android开发AnimationDrawable控制逐帧播放动画实现过程,希望文章对各位朋友带不一些帮助. 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的 ...

  9. Android中的动画具体解释系列【1】——逐帧动画

    逐帧动画事实上非常easy,以下我们来看一个样例: <?xml version="1.0" encoding="utf-8"?> <anima ...

随机推荐

  1. jsonp 格式

    jQuery(document).ready(function(){ $.ajax({ type: "get", async: false, url: "http://f ...

  2. Ruby系列教程(附ruby电子书下载)【转】

    摘要:http://www.cnblogs.com/dahuzizyd/category/97947.html 关键字:Ruby On Rails ,InstantRails,Windows,入门,教 ...

  3. github 获取repo 发布的版本号

    获取最新版本 https://api.github.com/repos/nickchou/paopao/releases/latest 获取版本列表 https://api.github.com/re ...

  4. LeetCode OJ-- LRU Cache ***@

    https://oj.leetcode.com/problems/lru-cache/ 涨姿势的一道题,相当于实现一种数据结构,实现最近最少使用数据结构. // 用来记录 前后节点都是什么 类似链表上 ...

  5. 16Aspx.com-书通网中小学生免费在线学习网站源码 带采集带手机版帝国cms内核

    =============================================== 源码站长资源交易专业网-商业源码下载,VIP源码,程序交易,毕业设计交易,站长交易|- 16aspx.c ...

  6. Java IO 学习(二)select/poll/epoll

    如上文所说,select/poll/epoll本质上都是同步阻塞的,但是由于实现了IO多路复用,在处理聊天室这种需要处理大量长连接但是每个连接上数据事件较少的场景时,相比最原始的为每个连接新开一个线程 ...

  7. 洛谷—— P2417 课程

    https://www.luogu.org/problemnew/show/2417 题目描述 n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有 ...

  8. 维生素C - 坏血症

    在地理大发现时代,许多水手在远洋航行时不幸罹患一种典型航海病,患者皮肤溃烂.牙龈出血不止,不久就会危及生命,这就是大名鼎鼎的坏血症,是一种因为缺乏维生素C而产生的的皮.粘膜下出血.齿龈肿胀.关节和肌肉 ...

  9. JSP介绍与语法-java之JSP学习第一天(非原创)

    文章大纲 一.JSP 简介二.JSP 生命周期三.JSP 语法四.学习资料下载五.参考文章   一.JSP 简介 1. 什么是Java Server Pages? JSP全称Java Server P ...

  10. (入门SpringBoot)SpringBoot结合logback(六)

    SpringBoot结合logback日志: 1.配置资源文件: #日志配置信息logbacklogging.config=classpath:logback-spring.xmllog.path=E ...