安卓案例:利用帧动画实现游戏特效
程序员文章站
2022-03-15 20:53:56
文章目录一、运行效果二、涉及知识点三、实现步骤1、创建安卓应用【GameSpecialEffect】2、将逐帧动画素材拷贝到drawable目录里3、主布局资源文件acitivity_main.xml4、字符串资源文件strings.xml5、主界面类MainActivity(1)声明变量(2)通过资源标识获得控件实例(3)初始化图像标识数组(4)创建消息处理器(5)创建开始按钮单击事件处理方法(6)创建停止按钮单击事件处理方法6、启动应用,查看效果上一个安卓案例【动态显示时间】,利用线程(Thread)...
文章目录
一、动画概念
- 动画的概念不同于一般意义上的动画片,动画是一种综合艺术,它是集合了绘画、漫画、电影、数字媒体、摄影、音乐、文学等众多艺术门类于一身的艺术表现形式。最早发源于19世纪上半叶的英国,兴盛于美国,中国动画起源于20世纪20年代。1892年10月28日埃米尔·雷诺首次在巴黎著名的葛莱凡蜡像馆向观众放映光学影戏,标志着动画的正式诞生,同时埃米尔·雷诺也被誉为“动画之父”。
- 动画的英文有很多表述,如animation、cartoon、animated cartoon、cameracature。其中较正式的 “Animation” 一词源自于拉丁文字根anima,意思为“灵魂”,动词animate是“赋予生命”的意思,引申为使某物活起来的意思。所以动画可以定义为使用绘画的手法,创造生命运动的艺术。
二、逐帧动画
- 逐帧动画(Frame-by-Frame Animation)是一种常见的动画形式,其原理是在“连续关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 因为逐帧动画的帧序列内容不一样,不但给制作增加了负担,而且最终输出的文件量也很大,但它的优势也很明显,逐帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,而它类似与电影的播放模式,很适合于表演细腻的动画。例如人物或动物急剧转身、 头发及衣服的飘动、走路、说话以及精致的3D效果等等。
- 逐帧动画有多种实现方式:利用动画资源文件实现、利用Thread和Handler来实现、利用Timer和Handler来实现。上一个安卓案例【动态显示时间】,利用线程(Thread)和消息处理器(Handler)实现帧动画,本次案例,我们学习如何利用定时器(Timer)和消息处理器(Handler)实现帧动画。
三、运行效果
四、涉及知识点
- 线性布局(LinearLayout)
- 图像视图(ImageView)
- 按钮(Button)
- 定时器(Timer)
- 定时器任务(TimerTask)
- 消息处理器(Handler)
五、游戏特效案例实现思路
- 逐帧动画,其实就要定时切换图片,定时操作可以利用定时器(Timer)来完成,切换图片就需要事先将所有图片的资源标识保存到一个数组里(这也是一个难点,尤其当图片数量比较大时),通过改变图片资源标识数组的当前索引达到切换图片的目的。但是,从安卓4.0版本以后,出于安全考虑,子线程不能直接更新主界面元素。怎么办呢?这就需要一种能沟通主线程和子线程的机制,而消息处理器Handler正是这样一种机制,实现不同线程间的通信。在子线程里,定时更新图片当前索引,然后通过handler的sendEmptyMessage方法将更新后的图片当前索引发送到主线程,最后,在主线程里,通过handler的handleMessage方法获取子线程发送过来的图片当前索引,利用这个索引获取当前图片的资源标识,作为参数传给图像控件的setImageRource方法,就达到更新图片的目的。
六、实现步骤
1、创建安卓应用【GameSpecialEffect】
2、将逐帧动画素材拷贝到drawable目录里
图片素材下载链接:https://pan.baidu.com/s/1FvyJ2_dB7F4inGftnIZ5mQ 提取码:ti7v
3、主布局资源文件acitivity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:gravity="center"
android:orientation="vertical"
tools:context="net.hw.game_special_effect.MainActivity">
<ImageView
android:id="@+id/ivBomb"
android:layout_width="250dp"
android:layout_height="250dp"
android:src="@drawable/img1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btnStart"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:background="#cccccc"
android:onClick="doStart"
android:text="@string/start"
android:textSize="25sp" />
<Button
android:id="@+id/btnStop"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:background="#cccccc"
android:onClick="doStop"
android:text="@string/stop"
android:textSize="25sp" />
</LinearLayout>
</LinearLayout>
4、字符串资源文件strings.xml
<resources>
<string name="app_name">帧动画:游戏特效</string>
<string name="start">开始</string>
<string name="stop">停止</string>
</resources>
5、主界面类MainActivity
(1)声明变量
(2)通过资源标识获得控件实例
(3)初始化图像标识数组
(4)创建消息处理器
- 创建消息处理器,处理从定时器任务里发送过来的消息,更新主界面元素
(5)创建开始按钮单击事件处理方法
(6)创建停止按钮单击事件处理方法
6、启动应用,查看效果
本文地址:https://blog.csdn.net/howard2005/article/details/108868417
下一篇: String的hashCode