Android 帧动画使用
帧动画
使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
播放起来,有点像在看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 drawable动画 https://developer.android.com/guide/topics/graphics/drawable-animation
- res资源目录简介 https://an.rustfisher.com/android/resource/resources_overview/
Android 帧动画使用的更多相关文章
- android 帧动画,补间动画,属性动画的简单总结
帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建ani ...
- android 帧动画
首先在res/drawable/name1.xml/定义一组图片集合: <?xml version="1.0" encoding="utf-8"?> ...
- android帧动画,移动位置,缩放,改变透明度等动画讲解
1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...
- android 帧动画的实现及图片过多时OOM解决方案(一)
一,animation_list.xml中静态配置帧动画的顺序,如下: <?xml version="1.0" encoding="utf-8"?> ...
- Android帧动画笔记
创建drawable资源文件,选择animation-list<?xml version="1.0" encoding="utf-8"?><a ...
- 如何解决Android帧动画出现的内存溢出
这几天在做动画的时候,遇到了一个OOM的问题,特此记录下来. 普通实现 实现一个帧动画,最先想到的就是用animation-list将全部图片按顺序放入,并设置时间间隔和播放模式.然后将该drawab ...
- Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源
2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...
- android帧动画,移动位置,缩放,改变透明度等动画解说
1.苦逼的需求又来了,须要实现一些动画效果,第一个想到的是播放gif图片,可是这样会占包的资源,而且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...
- [android] 帧动画和补间动画
逐帧显示一张图片,连起来成为动画 在res/drawable/目录下,创建一个xxx.xml的文件 添加<animation-list>节点,设置是否循环android:oneshot:” ...
随机推荐
- 通过jquery创建节点以及节点属性处理
<!DOCTYPE html><html> <head> <meta http-equiv="Content-type" conte ...
- Netty 框架学习 —— 添加 WebSocket 支持
WebSocket 简介 WebSocket 协议是完全重新设计的协议,旨在为 Web 上的双向数据传输问题提供一个切实可行的解决方案,使得客户端和服务器之间可以在任意时刻传输消息 Netty 对于 ...
- 解决 ORA-12154 TNS无法解析指定的连接标识符
相信作为ORACLE数据库的开发人员没有少碰到"ORA-12154: TNS: 无法解析指定的连接标识符",今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到同样问题 ...
- ssh-正向与反向代理
常用参数 栗子 实战 常用参数 -N 告诉SSH客户端,这个连接不需要执行任何命令.仅仅做端口转发 -C 表示压缩数据传输 -f 告诉SSH客户端在后台运行 -q Quiet mode. 安静模式,忽 ...
- CRM系统为什么达不到预期效果?
随着信息技术的发展,企业对于信息化转型的需求越发强烈,而CRM客户关系管理系统成为了企业信息化转型的首选.尽管CRM系统对于企业有着很重要的作用,但有不少企业在选型和实施时遇到了问题,导致CRM系统没 ...
- Rsync+Sersync数据实时同步(双向)
Rsync+Sersync数据实时同步(双向) 服务介绍 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.se ...
- Hadoop0.20.2中MapReduce读取gb2312文件出现乱码问题
单位用的是Linux系统的字符编码是gb2312,所以生成的文件都是按照默认编码生成的.给我的文件也都是gb2312的,在hadoop中运行mapreduce出现乱码,在网上查资料说是因为hadoop ...
- MySQL 卡死的问题
1. 执行show full processlist观察state和info两列,查看有哪些线程在运行. 2.使用kill命令+对应线程前面id杀死卡死的线程. 其他的方式: -- 查询是否锁表 sh ...
- 数据库表的自增ID createDate和updateDate 用JPA注解代替触发器实现
对于数据库表的自增ID , createDate和updateDate 等字段,用JPA注解代替触发器实现,效率会高很多. 由于这些属性很多entity都有 可以写成两个基本entity :BaseE ...
- Pytest学习笔记12-配置文件pytest.ini
前言 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行. 常用的配置项 marks 作用:测试用例中添加了自定义标记( ...