帧动画

使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。

播放起来,有点像在看gif图。

本文介绍使用AnimationDrawable类来实现动画效果。

为了开发方便,我们可以在xml中指定动画各个帧的信息。

使用背景图片

这是第一个例子。我们先准备4张图片(图片请自备)放进res/drawable/中。

在这个目录里,再新建一个文件ani_frame_1.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ani_frame_1"
android:oneshot="false">
<item
android:drawable="@drawable/f_zan_1"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_4"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_3"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_2"
android:duration="250" />
</animation-list>

可以看到根节点<animation-list>包含了4个item。每个子节点都定义了一个帧。

duration是这一帧的时常(毫秒)。drawable是指定可绘制资源。oneshot="false",表示让动画一直循环播放下去。

这样动画资源就准备好了。

在layout中准备一个ImageView,用它来显示动画

<ImageView
android:id="@+id/iv1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="60dp" />

在activity中操作这个ImageView。把动画资源设置为背景。

var mFrameIv: ImageView? = null
// override fun onCreate(savedInstanceState: Bundle?)
mFrameIv = findViewById(R.id.iv1)
mFrameIv!!.setBackgroundResource(R.drawable.ani_frame_1)

把ImageView的背景强转为AnimationDrawable。播放动画,要用AnimationDrawable.start()方法。

val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
ani.start()

当动画正在播放时,调用start()方法是不会影响当前播放的。

停止动画,AnimationDrawable.stop()

val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
ani.stop()

stop()方法可以让动画停止在当前帧。再调用start()的话,会从头开始播放。

使用src

前面我们利用的是ImageView的背景资源。我们也可以使用src

准备另一个动画资源ani_frame_2

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ani_frame_1"
android:oneshot="true">
<item
android:drawable="@drawable/f_zan_1"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_4"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_3"
android:duration="250" />
<item
android:drawable="@drawable/f_zan_2"
android:duration="250" />
</animation-list>

android:oneshot="true",动画播放1次后就会自行停止并保持在最后一帧。

! 注意,停止后并不是回到第一帧。

然后在layout中,把它设置为ImageView的src

<ImageView
android:id="@+id/iv1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="60dp"
android:src="@drawable/ani_frame_2" />

在activity中就不是操作ImageView的background了,而是操作drawable

// 启动
val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
ani.start() // 停止
val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
ani.stop()

可以看到,2个例子中都需要操作AnimationDrawable

请务必注意,对 AnimationDrawable.start() 方法不能在 Activity 的 onCreate() 方法期间调用,因为 AnimationDrawable 尚未完全附加到窗口。如果想立即播放动画而无需互动,那么可能需要从 Activity 中的 onStart() 方法进行调用,该方法会在 Android 在屏幕上呈现视图时调用。

AnimationDrawable类有几个属性可以注意一下

属性 说明
isOneShot 是否只播放1次,与xml中的android:oneshot对应
isRunning 当前动画是否正在播放
numberOfFrames 帧的数量

参考

Android 帧动画使用的更多相关文章

  1. android 帧动画,补间动画,属性动画的简单总结

      帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建ani ...

  2. android 帧动画

    首先在res/drawable/name1.xml/定义一组图片集合: <?xml version="1.0" encoding="utf-8"?> ...

  3. android帧动画,移动位置,缩放,改变透明度等动画讲解

    1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...

  4. android 帧动画的实现及图片过多时OOM解决方案(一)

    一,animation_list.xml中静态配置帧动画的顺序,如下: <?xml version="1.0" encoding="utf-8"?> ...

  5. Android帧动画笔记

    创建drawable资源文件,选择animation-list<?xml version="1.0" encoding="utf-8"?><a ...

  6. 如何解决Android帧动画出现的内存溢出

    这几天在做动画的时候,遇到了一个OOM的问题,特此记录下来. 普通实现 实现一个帧动画,最先想到的就是用animation-list将全部图片按顺序放入,并设置时间间隔和播放模式.然后将该drawab ...

  7. Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源

    2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...

  8. android帧动画,移动位置,缩放,改变透明度等动画解说

    1.苦逼的需求又来了,须要实现一些动画效果,第一个想到的是播放gif图片,可是这样会占包的资源,而且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...

  9. [android] 帧动画和补间动画

    逐帧显示一张图片,连起来成为动画 在res/drawable/目录下,创建一个xxx.xml的文件 添加<animation-list>节点,设置是否循环android:oneshot:” ...

随机推荐

  1. Linux 中使用 QT Charts 显示温度传感器

    前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...

  2. 12.10、elk实用案例

    1.架构图: 服务器名称 ip地址 controller-node1(主) 172.16.1.90 slave-node1(从) 172.16.1.91 2.安装filebeat: filebeat不 ...

  3. Python协程你学会了吗?

    在学习协程之前,你需要先知道协程是什么?协程又称为微线程,一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程.我们知道多个线程相对独立,有自己的上下文,切换受系统控 ...

  4. docker基本操作和部署

    #安装所需的软件包.yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data ...

  5. 被swoole坑哭的PHP程序员 (转)

    本文主要记录一下学习swoole的过程.填过的坑以及swoole究竟有多么强大! 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强大功能.外界对其的崇 ...

  6. php弱类型比较

    前言:今天XCTF题目中出现了弱类型比较,特别过来记录一下, 0x01: == 是弱类型比较,两个不同类型比较时,会自动转换成相同类型后再比较值 ===是强比较,需要比较值和类型 0x02: 看下图案 ...

  7. sql通用行列转换

    -- 行转列 select 姓名, SUM(case 课程 when '语文' then 分数 else 0 end) as 语文, SUM(case 课程 when '数学' then 分数 els ...

  8. 史上最全的Nginx配置文档

    Nginx是一个异步框架的Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存.该软件由Igor Sysoev 创建,并于2004年首次公开发布.同名公司成立于2011年,以提供支持.Ngi ...

  9. 5000字2021最新Python基础知识第一阶段:数据类型

    1 编程规范 注释 python注释也有自己的规范,在文章中会介绍到.注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的 ...

  10. 家庭账本开发day04

    对之前的构架进行修改,对成员类新加属性余额,在进行账单的新增时 ,对余额进行相应的修改.并且对账单类加入属性:id方便之后的查询和 删除操作