Android 帧动画 浅析

什么是帧动画

百度百科中解释

逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 因为逐帧动画的帧序列内容不一样,不但给制作增加了负担而且最终输出的文件量也很大,但它的优势也很明显:逐帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,而它类似与电影的播放模式,很适合于表演细腻的动画。例如:人物或动物急剧转身、 头发及衣服的飘动、走路、说话以及精致的3D效果等等

动画的分类

在 Android开发中 动画被分成两大类,属性动画,视图动画
其中 视图动画 又可以细分为 帧动画 和 补间动画

  • 属性动画
  • 视图动画
    • 帧动画
    • 补间动画

如何使用帧动画

在Android开发中,使用帧动画,他的核心类 是 AnimationDrawable

有两种方式可以使用帧动画,一种是写入静态xml 获得 AnimationDrawable ,还有一种是创建 AnimationDrawable 对象以后,对其添加关键帧

创建xml 资源文件

xml 中的 drawable 新建一个 根节点为animation-list动画的 资源

将每一帧动画按顺序摆放

例如 新建一个 anim_frame.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!-- oneshot 是否只播放一次 -->
<!-- duration 延时时间 单位毫秒 -->
<item android:drawable="@drawable/farm_0" android:duration="100" />
<item android:drawable="@drawable/farm_1" android:duration="100" />
<item android:drawable="@drawable/farm_2" android:duration="100" />

</animation-list>

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50


class FrameAct : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ainm_frame)


// 方式1 使用xml

//找到 帧动画的资源
val animationDrawable: AnimationDrawable =
ContextCompat.getDrawable(this, R.drawable.anim_frame) as AnimationDrawable
//设置image 的 background
img_frame.background = animationDrawable
//也可直接在 xml 中 设置 ImageView background


//方式2 动态代码添加

val animationDrawable2 = AnimationDrawable()

//添加图片信息
for (index in 0..2) {
val resId = resources.getIdentifier("farm_$index", "drawable", packageName)
animationDrawable2.addFrame(resources.getDrawable(resId, null), 100)
}

//设置循环播放
animationDrawable2.isOneShot = false
//将AnimationDrawable 设置给imageView
img_frame_2.setImageDrawable(animationDrawable2)


btn_start.setOnClickListener {
//开始播放帧动画
animationDrawable.start()
animationDrawable2.start()
}

btn_stop.setOnClickListener {
//停止播放帧动画
animationDrawable.stop()
animationDrawable2.stop()
}


}
}

属性值含义

参数含义
oneshot是否只播放一次 false: 只播放一次; true:循环播放
duration播放时间
drawable图片资源

帧动画 优缺点 分析

优点:对于一些非常复杂的动画,可以使用,实际项目中非常复杂的动画会使用 lottie

缺点:因为是多张图片逐帧播放的,对于内存的消耗比较大。