安卓案例:利用幀動畫實現遊戲特效

2020-10-01 16:00:47

一、動畫概念

  • 動畫的概念不同於一般意義上的動畫片,動畫是一種綜合藝術,它是集合了繪畫、漫畫、電影、數位媒體、攝影、音樂、文學等眾多藝術門類於一身的藝術表現形式。最早發源於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、啟動應用,檢視效果

在這裡插入圖片描述