前言

作为 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. java修炼

    java程序员修炼之道——大牛告诉我们应该好好学习与修炼以下知识与技能   ———————————————————— 一:Java语言学习(对线程(thread),串行化,反射,网络编程,JNI技术, ...

  2. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  3. 浮点优化选项 -ffast-math:极大地提高浮点运算速度【转】

    转自:http://blog.csdn.net/zjujoe/article/details/2604157 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 关于浮点优化选项摘 ...

  4. C# Stopwatch详解

    namespace System.Diagnostics { // // 摘要: // 提供一组方法和属性,可用于准确地测量运行时间. public class Stopwatch { // // 摘 ...

  5. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  6. json手动解析详解

    项目中有时候仅仅需要一个或者多个字段时可以使用这种解析方式,省去创建实体类. 1.首先讲解下最基本的数据格式. 例如: String json="{'name':'小明','action': ...

  7. Educational Codeforces Round 35 A. Nearest Minimums【预处理】

    [题目链接]: Educational Codeforces Round 35 (Rated for Div. 2) A. Nearest Minimums time limit per test 2 ...

  8. Codeforces 912D Fishes (概率&期望,优先队列的应用)

    题目链接 Fishes 题意  在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...

  9. 基于 OpenResty 的动态服务路由方案

    2019 年 5 月 11 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙武汉站,又拍云首席布道师在活动上做了< 基于 OpenResty ...

  10. 洛谷——P1977 出租车拼车

    题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...