安卓案例:利用帧动画实现游戏特效

一、动画概念

  • 动画的概念不同于一般意义上的动画片,动画是一种综合艺术,它是集合了绘画、漫画、电影、数字媒体、摄影、音乐、文学等众多艺术门类于一身的艺术表现形式。最早发源于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)实现帧动画。

三、运行效果

在这里插入图片描述

四、涉及知识点

  1. 线性布局(LinearLayout)
  2. 图像视图(ImageView)
  3. 按钮(Button)
  4. 定时器(Timer)
  5. 定时器任务(TimerTask)
  6. 消息处理器(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、启动应用,查看效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/108868417