




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五章第五章 android游戲開(kāi)發(fā)游戲開(kāi)發(fā)本章的主要內(nèi)容:5.1、android游戲開(kāi)發(fā)框架5.2、Graphics類開(kāi)發(fā)5.3、動(dòng)畫實(shí)現(xiàn)5.4、小結(jié)5.1 View類開(kāi)發(fā)框架 View這個(gè)類是描畫塊狀視圖的基類。View會(huì)繪制一個(gè)包含的Drawing是event事件的方形塊,是一切與用戶交互的組件的Widgets的基類(Buttons,textField等),View的子類ViewGroup是layouts類的基類,layouts類可以包含其他的View/ViewGroup組件并且定義展現(xiàn)的屬性。 游戲最重要的是與玩家交互,比如鍵盤輸入、觸筆點(diǎn)擊等事件。android中提供了 onKeyU
2、p、onKeyDown、onKeyMultiple、onKeyPreIme、onTouchEvent、onTrackballEvent等方法,可以輕松地處置游戲中的時(shí)間音訊。所以在承繼View時(shí),需求重載這幾個(gè)方法,當(dāng)有按鍵按下或彈起的時(shí)候,會(huì)自動(dòng)調(diào)用方法來(lái)處置。 游戲的中心是不斷地繪圖和刷新界面,圖我們可以經(jīng)過(guò)onDraw方法繪制。android中提供了invalidate方法實(shí)現(xiàn)界面的刷新。 留意:invalidate不能直接在線程中調(diào)用,他違背了單線程模型。UI操作并不是線程平安的,這些操作必需在UI線程中執(zhí)行。android中最常用的方法是利用Handler來(lái)實(shí)現(xiàn)UI的更新。實(shí)例演示
3、下面經(jīng)過(guò)實(shí)現(xiàn)一個(gè)在屏幕上不停變換顏色的矩形來(lái)分析android的界面更新。該實(shí)例中,我們經(jīng)過(guò)Handler對(duì)象并重寫了handleMessage方法實(shí)現(xiàn)一個(gè)音訊的接納器,然后在線程中經(jīng)過(guò)sendMessage方法發(fā)送更新界面信息,當(dāng)接納器收到更新界面的信息時(shí) ,便執(zhí)行Invalidate方法 實(shí)現(xiàn)更新在屏幕上顯示。Example_05_1運(yùn)轉(zhuǎn)結(jié)果如下5.1.2 SurfaceView類開(kāi)發(fā)框架 上一節(jié)講解了View類的游戲開(kāi)發(fā)框架,當(dāng)需求開(kāi)發(fā)復(fù)雜的游戲的時(shí)候,對(duì)程序的執(zhí)行效率要求很高時(shí),這時(shí)必需運(yùn)用SurfaceView類進(jìn)展開(kāi)發(fā)。例如對(duì)于速度很高的游戲可以運(yùn)用雙緩沖技術(shù)來(lái)顯示。游戲中的人物、
4、背景、動(dòng)畫等都需求畫在一個(gè)畫布上,而SurfaceView可以直接訪問(wèn)這個(gè)畫布。SurfaceView是提供應(yīng)需求直接畫像素而不是運(yùn)用窗體部件的運(yùn)用運(yùn)用的。 android圖形系一致個(gè)重要的概念是surface 、View 及其子類要畫在畫布上,每一個(gè)Surface創(chuàng)建一個(gè)Canvas對(duì)象。來(lái)管理View在Surface上的繪圖操作。 在運(yùn)用SurfaceView開(kāi)發(fā)時(shí)需求留意的是,運(yùn)用它繪圖時(shí),普通都是出如今最頂層。運(yùn)用時(shí)還需求對(duì)其進(jìn)展創(chuàng)建、銷毀,情況改動(dòng)時(shí)進(jìn)展監(jiān)視,這就要實(shí)現(xiàn)SurfaceHolder.Callback接口,假設(shè)要對(duì)被繪制的畫布進(jìn)展裁剪,控制其大小時(shí)都需求運(yùn)用Surface
5、Holder來(lái)完成處置。在程序中,SurfaceHolder對(duì)象需求經(jīng)過(guò)getHolder方法來(lái)獲得,同時(shí)還需求addCallback方法來(lái)添加“回調(diào)函數(shù)。 SurfaceView和View的明顯不同之處在于,SurfaceView不需求經(jīng)過(guò)線程來(lái)更新視圖,但在繪制之前必需運(yùn)用lockCanvas方法鎖定畫布,并得到畫布,然后在畫布上繪制;當(dāng)繪制完成后,運(yùn)用unlockCanvasAndPost方法來(lái)解鎖畫布,于是才干顯示在屏幕之上。SurfaceView類的事件處置那么和View一樣。實(shí)例演示 本例經(jīng)過(guò)SurfaceView類實(shí)現(xiàn)一個(gè)游戲框架,該實(shí)例繪制了一個(gè)不斷變換顏色的圓,并且實(shí)現(xiàn)了Su
6、rfaceView的事件處置。我們按上下鍵時(shí),圖形可以挪動(dòng)。其控制整個(gè)運(yùn)用流程的Activity類與上一節(jié)差不多。 下面是運(yùn)轉(zhuǎn)結(jié)果演示詳細(xì)代碼見(jiàn)書本P115。運(yùn)轉(zhuǎn)結(jié)果展現(xiàn)5.2 Graphics 類開(kāi)發(fā) 前面我們?cè)?jīng)分析了android中游戲開(kāi)發(fā)中常用的兩個(gè)視圖類的開(kāi)發(fā)框架,下面學(xué)習(xí)如何運(yùn)用android中的Graphics類繪制圖形。 要開(kāi)發(fā)游戲,必需會(huì)在屏幕上繪制2D圖形,在android中需求經(jīng)過(guò)Graphics類來(lái)顯示2D圖形。Graphics類包含了Canvas畫布、Paint畫筆、Color顏色、Bitmap圖像、2D幾何圖形等常用類。5.2.1 Paint和Color類簡(jiǎn)介 要繪
7、圖,首先得調(diào)整畫筆,待畫筆調(diào)整好之后,再將圖像繪制到畫布上,這樣才可以顯示在手機(jī)屏幕上。Android 中的畫筆是 Paint類,Paint 中包含了很多方法對(duì)其屬性進(jìn)展設(shè)置,主要方法如下: etAntiAlias: 設(shè)置畫筆的鋸齒效果。 setColor: 設(shè)置畫筆顏色 setARGB: 設(shè)置畫筆的a,r,p,g值。 setAlpha: 設(shè)置Alpha值 setTextSize: 設(shè)置字體尺寸。 setStyle: 設(shè)置畫筆風(fēng)格,空心或者實(shí)心。 setStrokeWidth: 設(shè)置空心的邊框?qū)挾取?getColor: 得到畫筆的顏色 getAlpha: 得到畫筆的Alpha值。 Color類
8、更加簡(jiǎn)單,主要定義了一些顏色常量,以及對(duì)顏色的轉(zhuǎn)換等。主要的十二種顏色如下: Color類還提供了Color.rgb的方法將整形的顏色轉(zhuǎn)換成Color類型,如Color.red方法可以提取紅色的值。下面我們來(lái)看一個(gè)實(shí)例,分別闡明這些方法的運(yùn)用,運(yùn)轉(zhuǎn)效果如后圖所示。詳細(xì)代碼見(jiàn)書P119代碼演示: package com.yarin.android.Examples_05_03;/導(dǎo)入的包略,詳見(jiàn)源代碼public class GameView extends View implements Runnablepublic final static String TAG= Examples_05_0
9、3_GameView;/ /* 聲明Paint對(duì)象 */private PaintmPaint = null;public GameView(Context context)super(context);/* 構(gòu)建對(duì)象 */mPaint = new Paint();/* 開(kāi)啟線程 */new Thread(this).start();public void onDraw(Canvas canvas)super.onDraw(canvas);/* 設(shè)置Paint為無(wú)鋸齒 */mPaint.setAntiAlias(true);/* 設(shè)置Paint的顏色 */mPaint.setColor(Col
10、or.RED);mPaint.setColor(Color.BLUE);mPaint.setColor(Color.YELLOW);mPaint.setColor(Color.GREEN);/* 同樣是設(shè)置顏色 */mPaint.setColor(Color.rgb(255, 0, 0);/* 提取顏色 */Color.red(0 xcccccc);Color.green(0 xcccccc);/* 設(shè)置paint的顏色和Alpha值(a,r,g,b) */mPaint.setARGB(255, 255, 0, 0);/* 設(shè)置paint的Alpha值 */mPaint.setAlpha(22
11、0);mPaint.setTextSize(14);/ 設(shè)置paint的風(fēng)格為“空心./ 當(dāng)然也可以設(shè)置為“實(shí)心(Paint.Style.FILL)mPaint.setStyle(Paint.Style.STROKE);/ 設(shè)置“空心的外框的寬度。mPaint.setStrokeWidth(5);/* 得到Paint的一些屬性 */Log.i(TAG, paint的顏色: + mPaint.getColor();Log.i(TAG, paint的Alpha: + mPaint.getAlpha();Log.i(TAG, paint的外框的寬度: + mPaint.getStrokeWidth(
12、);Log.i(TAG, paint的字體尺寸: + mPaint.getTextSize();/* 繪制一個(gè)矩形 */ 一定是一個(gè)空心的舉行canvas.drawRect(320 - 80) / 2, 20, (320 - 80) / 2 + 80, 20 + 40, mPaint);mPaint.setStyle(Paint.Style.FILL);mPaint.setColor(Color.GREEN);/* 繪制綠色實(shí)心矩形 */canvas.drawRect(0, 20, 40, 20 + 40, mPaint);/ 觸筆事件public boolean onTouchEvent(M
13、otionEvent event)return true;/ 按鍵按下事件public boolean onKeyDown(int keyCode, KeyEvent event)return true;/ 按鍵彈起事件public boolean onKeyUp(int keyCode, KeyEvent event)return false;public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)return true;public void run()while (!Thread.currentT
14、hread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/ 運(yùn)用postInvalidate可以直接在線程中更新面postInvalidate();測(cè)試結(jié)果演示5.2.2 Canvas 類引見(jiàn) 當(dāng)我們調(diào)整好畫筆之后,如今需求繪制到畫布上,這就得用Canvas類了。在Android中既然把Canvas當(dāng)做畫布,那么就可以在畫布上繪制我們想要的任何東西。除了在畫布上繪制之外,還需求設(shè)置一些關(guān)于畫布的屬性,比如,畫布的顏色、尺寸等。 下面來(lái)
15、分析Android中Canvas有哪些功能,Canvas提供了如下一些方法: Canvas(): 創(chuàng)建一個(gè)空的畫布,可以運(yùn)用setBitmap()方法來(lái)設(shè)置繪制詳細(xì)的畫布。 Canvas(Bitmap bitmap): 以bitmap對(duì)象創(chuàng)建一個(gè)畫布,那么將內(nèi)容都繪制在bitmap上,因此bitmap不得為null。 Canvas(GL gl): 在繪制3D效果時(shí)運(yùn)用,與OpenGL相關(guān)。 drawColor: 設(shè)置Canvas的背景顏色。 setBitmap: 設(shè)置詳細(xì)畫布。 clipRect: 設(shè)置顯示區(qū)域,即設(shè)置裁剪區(qū)。 isOpaque:檢測(cè)能否支持透明。 rotate: 旋轉(zhuǎn)畫布 s
16、etViewport: 設(shè)置畫布中顯示窗口。 skew: 設(shè)置偏移量。 上面列舉了幾個(gè)常用的方法。在游戲開(kāi)發(fā)中,我們能夠需求對(duì)某個(gè)精靈執(zhí)行旋轉(zhuǎn)、縮放和一些其它操作。我們可以經(jīng)過(guò)旋轉(zhuǎn)畫布來(lái)實(shí)現(xiàn),但是旋轉(zhuǎn)畫布時(shí)會(huì)旋轉(zhuǎn)畫布上的一切對(duì)象,而我們只是需求旋轉(zhuǎn)其中的一個(gè),這時(shí)就需求用到save 方法來(lái)鎖定需求操作的對(duì)象,在操作之后經(jīng)過(guò) restore 方法來(lái)解除鎖定。 我們對(duì)左邊的矩形執(zhí)行了旋轉(zhuǎn)操作,而沒(méi)有旋轉(zhuǎn)右邊的矩形,由于我們?cè)O(shè)置了裁剪區(qū)域,因此左邊的矩形只能看到一部分,下面讓我們來(lái)看看代碼 這里我只貼出了我們本人的 View類 GameView, Activity類不貼出了 就在里邊 new 一個(gè)G
17、ameView類 然后設(shè)置規(guī)劃 然后main.xml也不貼出來(lái)了 由于它根本就沒(méi)用到。代碼展現(xiàn)package com.yarin.android.Examples_05_04;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.view.KeyEvent;import android.view.MotionEvent;
18、import android.view.View;public class GameView extends View implements Runnable/* 聲明Paint對(duì)象 */private PaintmPaint= null;public GameView(Context context)super(context);/* 構(gòu)建對(duì)象 */mPaint = new Paint();/* 開(kāi)啟線程 */new Thread(this).start();public void onDraw(Canvas canvas)super.onDraw(canvas);/* 設(shè)置畫布的顏色 */
19、canvas.drawColor(Color.BLACK);/* 設(shè)置取消鋸齒效果 */mPaint.setAntiAlias(true);/* 設(shè)置裁剪區(qū)域 */canvas.clipRect(10, 10, 280, 260);/* 線鎖定畫布 */canvas.save();/* 旋轉(zhuǎn)畫布 */canvas.rotate(45.0f); /* 設(shè)置顏色及繪制矩形 */mPaint.setColor(Color.RED);canvas.drawRect(new Rect(15,15,140,70), mPaint);/* 解除畫布的鎖定 */canvas.restore(); /* 設(shè)置顏
20、色及繪制另一個(gè)矩形 */mPaint.setColor(Color.GREEN);canvas.drawRect(new Rect(150,75,260,120), mPaint);/ 觸筆事件public boolean onTouchEvent(MotionEvent event)return true;/ 按鍵按下事件public boolean onKeyDown(int keyCode, KeyEvent event)return true;/ 按鍵彈起事件public boolean onKeyUp(int keyCode, KeyEvent event)return false;
21、public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)return true;public void run()while (!Thread.currentThread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/ 運(yùn)用postInvalidate可以直接在線程中更新界面postInvalidate();運(yùn)轉(zhuǎn)結(jié)果展現(xiàn)5.2.3幾何圖形繪制
22、前面講到的是畫普通都是一些矩形,今天就看看怎樣在android手機(jī)屏幕上繪制一些幾何圖形,如三角形、多邊形、橢圓、圓形、正方形 等等。并且設(shè)置 空心、實(shí)心。下面我們先來(lái)看看 在android中可以繪制出那些幾何圖形 。android 中可以繪制的幾何圖形 方法 闡明 drawRect 繪制矩形 drawCircle 繪制圓形 drawOval 繪制橢圓 drawPath 繪制恣意多邊形 drawLine 繪制直線 drawPoin 繪制點(diǎn) 下面經(jīng)過(guò)一個(gè)例子來(lái)看看如何繪制這些圖形,運(yùn)轉(zhuǎn)結(jié)果如下。完好代碼請(qǐng)參見(jiàn)本書P123,實(shí)例中分別繪制了空心和實(shí)心的幾何圖形。5.2.4 字符串的繪制 在游戲開(kāi)發(fā)
23、中,我們不能夠全部用圖片來(lái)顯示,很多時(shí)候需求繪制字符串,比如開(kāi)發(fā)一個(gè)RPG游戲,有大量的對(duì)話內(nèi)容,這時(shí)假設(shè)全部用圖片來(lái)顯示一定不行。下面我們就看看假設(shè)在Canvas 畫布中繪制字符串。 android中提供了一系列的drawText方法來(lái)繪制字符串,在繪制字符串之前需求設(shè)置畫筆對(duì)象,包括字符串的尺寸、顏色等屬性。運(yùn)用FontMetrics 來(lái)規(guī)劃字體的屬性,可以經(jīng)過(guò)getFontMetrics 方法來(lái)獲得系統(tǒng)字體的相關(guān)內(nèi)容。下面來(lái)看一個(gè)大量文本自動(dòng)換行、翻頁(yè)和例如是如何操作字符串的,運(yùn)轉(zhuǎn)效果 見(jiàn)以下圖: 當(dāng)我們按下方向鍵時(shí)就會(huì)換到下一行字體 上方向鍵換到上一行字體。下面我們列出在字符串處置時(shí)常
24、用的方法: setTextSize: 設(shè)置字符串的尺寸 setARGB: 設(shè)置顏色(ARGB) getTextWidths: 獲得字符串的寬度 setFlags (Paint.ANTI_ALIAS_FLAG): 消除鋸齒。 由于這個(gè)例如的代碼 比較長(zhǎng) ,在這里 就不貼出來(lái)了,有時(shí)間并且感興趣的沒(méi)有可以看書根源碼研討。5.2.5 圖像繪制 在android中,工程目錄下“resdrawable用來(lái)放置一些該工程的圖片資源,那么如何顯示這些圖片資源呢,android中提供了Bitmap來(lái)存放這些資源,如下代碼可以經(jīng)過(guò)一個(gè)資源索引來(lái)得到其圖像對(duì)象Bitmap。 (BitmapDrawablegetR
25、esourses.getDrawable資源索引.getBitmap() Bitmap 還提供了一些方法,比如getHeight方法和getWidth方法可以獲得這些圖像的高度和寬度,我們將在下面的實(shí)例中分析如何運(yùn)用這些方法,并將圖像顯示在屏幕上,運(yùn)轉(zhuǎn)效果如以下圖所示,完好代碼見(jiàn)書本P 圖像旋轉(zhuǎn) 在Android中進(jìn)展圖像旋轉(zhuǎn)需求運(yùn)用Matrix,它包含了一個(gè)3*3的矩陣,專門用于進(jìn)展圖像變換匹配。Matrix ,中文里叫矩陣,高等數(shù)學(xué)里有引見(jiàn),在圖像處置方面,主要是用于平面的縮放、平移、旋轉(zhuǎn)等操作。Matrix沒(méi)有機(jī)構(gòu)體,它必需初始化,然后經(jīng)過(guò)reset方法和set方法來(lái)實(shí)
26、現(xiàn)。 首先引見(jiàn)一下矩陣運(yùn)算。加法和減法就不用說(shuō)了,太簡(jiǎn)單了,對(duì)應(yīng)位相加就好。圖像處置,主要用到的是乘法 。下面是一個(gè)乘法的公式: 在 Android 里面, Matrix 由 9 個(gè) float 值構(gòu)成,是一個(gè) 3*3 的矩陣。如以下圖。 解釋一下,上面的 sinX 和 cosX ,表示旋轉(zhuǎn)角度的 cos 值和 sin 值,留意,旋轉(zhuǎn)角度是按順時(shí)針?lè)较蛴?jì)算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是縮放的比例, 1 是不變, 2 是表示縮放 1/2,這樣子。 Matrix的操作,總共分為translate平移,rotate旋轉(zhuǎn),scale縮
27、放和skew傾斜四種,每一種變換在Android的API里都提供了set,post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點(diǎn)。set是直接設(shè)置Matrix的值,每次set一次,整個(gè)Matrix的數(shù)組都會(huì)變掉。 我們?nèi)缃窠?jīng)過(guò)setRotate設(shè)置旋轉(zhuǎn)角度,用creatBitmap創(chuàng)建一個(gè)經(jīng)過(guò)旋轉(zhuǎn)等處置的Bitmap對(duì)象,然后將Bitmap繪制到屏幕之上,于是就實(shí)現(xiàn)了旋轉(zhuǎn)操作。運(yùn)轉(zhuǎn)結(jié)果展現(xiàn)如下5.2.7 圖像的縮放 前面發(fā)過(guò)一篇如何利用Matrix來(lái)旋轉(zhuǎn)圖像,那么如何來(lái)縮放圖像呢?其實(shí)旋轉(zhuǎn)和縮放一樣,不同的是需求運(yùn)用Matrix 和 postScale 方法來(lái)設(shè)置圖
28、像縮放的倍數(shù)。下面的例如可以經(jīng)過(guò)上下鍵來(lái)縮放和放大圖像。 至于怎樣旋轉(zhuǎn)圖像 大家請(qǐng)看書上例子 ,當(dāng)然我們需求先看運(yùn)轉(zhuǎn)效果。 縮放效果展現(xiàn)5.2.8 圖像像素操作 在我們玩的游戲中我們會(huì)經(jīng)常見(jiàn)到一些圖像的特效,比如半透明等效果。要實(shí)現(xiàn)這種半透明效果其實(shí)并不難,需求我們懂得圖像像素的操作。不要怕,其真實(shí)Android中Bitmap為我們提供了操作像素的根本方法。 我們可以經(jīng)過(guò)getPixels()方法獲得該圖像的像素并放到一個(gè)數(shù)組中去,我們操作這個(gè)數(shù)組就可以了。最后經(jīng)過(guò)setPixels方法設(shè)置這個(gè)數(shù)組到Bitmap中。 在Android中,每一個(gè)圖像像素經(jīng)過(guò)一個(gè)4字節(jié)整數(shù)來(lái)展現(xiàn):最高位字節(jié)用作A
29、lpha通道,即用來(lái)實(shí)現(xiàn)透明與不透明控制,255代表完全不透明,0那么代表完全透明;接下來(lái)的一個(gè)字節(jié)是Red紅色通道,255代表完全是紅包。依次類推,接下來(lái)的兩個(gè)字節(jié)相應(yīng)地實(shí)現(xiàn)綠色和藍(lán)色通道。5.2.9 Shader類引見(jiàn) Android中提供了Shader類專門用來(lái)渲染圖像以及一些幾何圖形,Shader下面包括幾個(gè)直接子類,分別是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用來(lái)渲染圖像,LinearGradient 用來(lái)進(jìn)展梯度渲染,RadialGradient
30、用來(lái)進(jìn)展環(huán)形渲染,SweepGradient 用來(lái)進(jìn)展梯度渲染,ComposeShader那么是一個(gè) 混合渲染,可以和其它幾個(gè)子類組合起來(lái)運(yùn)用。 Shader類的運(yùn)用,都需求先構(gòu)建Shader對(duì)象,然后經(jīng)過(guò)Paint的setShader方法設(shè)置渲染對(duì)象,然后設(shè)置渲染對(duì)象,然后再繪制時(shí)運(yùn)用這個(gè)Paint對(duì)象即可。當(dāng)然,用不同的渲染時(shí)需求構(gòu)建不同的對(duì)象。 下面是一個(gè)簡(jiǎn)單的例如,其適用起來(lái)比較簡(jiǎn)單了 只是方法參數(shù)比較多。但是還比較容易了解。大家可以去翻翻API 這里就不深化討論了,以后用到再說(shuō)吧。 運(yùn)轉(zhuǎn)效果展現(xiàn)5.2.10 雙緩沖技術(shù) Android中的SurfaceView類就是雙緩沖機(jī)制。因此,
31、開(kāi)發(fā)游戲時(shí)盡量運(yùn)用SurfaceView而不要運(yùn)用View,這樣的話效率較高,而且SurfaceView的功能也更加完善。為了更容易的了解雙緩沖技術(shù),下面引見(jiàn)用View實(shí)現(xiàn)雙緩沖的方法。 先概述一下,雙緩沖的中心技術(shù)就是先經(jīng)過(guò)setBitmap方法將要繪制的一切的圖形會(huì)知道一個(gè)Bitmap上,然后再來(lái)調(diào)用drawBitmap方法繪制出這個(gè)Bitmap,顯示在屏幕上。詳細(xì)的實(shí)現(xiàn)代碼如下:package com.yarin.android.Examples_05_12;import android.content.Context;public class GameView extends View
32、 implements Runnable/* 聲明Bitmap對(duì)象 */BitmapmBitQQ= null;Paint mPaint = null;/* 創(chuàng)建一個(gè)緩沖區(qū) */BitmapmSCBitmap = null;/* 創(chuàng)建Canvas對(duì)象 */Canvas mCanvas = null; public GameView(Context context)super(context);/* 裝載資源 */mBitQQ = (BitmapDrawable) getResources().getDrawable(R.drawable.).getBitmap();/* 創(chuàng)建屏幕大小的緩沖區(qū) *
33、/mSCBitmap=Bitmap.createBitmap(320, 480, Config.ARGB_8888); /* 創(chuàng)建Canvas */mCanvas = new Canvas(); /* 設(shè)置將內(nèi)容繪制在mSCBitmap上 */mCanvas.setBitmap(mSCBitmap); mPaint = new Paint();/* 將mBitQQ繪制到mSCBitmap上 */mCanvas.drawBitmap(mBitQQ, 0, 0, mPaint);/* 開(kāi)啟線程 */new Thread(this).start();public void onDraw(Canvas
34、 canvas)super.onDraw(canvas);/* 將mSCBitmap顯示到屏幕上 */canvas.drawBitmap(mSCBitmap, 0, 0, mPaint);/ 觸筆事件public boolean onTouchEvent(MotionEvent event)return true;/ 按鍵按下事件public boolean onKeyDown(int keyCode, KeyEvent event)return true;/ 按鍵彈起事件public boolean onKeyUp(int keyCode, KeyEvent event)return fal
35、se;public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)return true;/* * 線程處置 */public void run()while (!Thread.currentThread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/運(yùn)用postInvalidate可以直接在線程中更新界面postInvalidate();運(yùn)轉(zhuǎn)效果
36、展現(xiàn)5.2.11 全屏顯示 我們前面所寫的程序在運(yùn)轉(zhuǎn)時(shí)屏幕頂部都帶有標(biāo)題欄和系統(tǒng)信息欄,但在開(kāi)發(fā)游戲時(shí),會(huì)由于界面美觀等要素不需求顯示這些多余的界面,而將更多的區(qū)域留給游戲界面來(lái)控制,這就需求實(shí)現(xiàn)設(shè)置全屏方式。經(jīng)過(guò)requestWindowFeature方法可以設(shè)置標(biāo)題欄能否顯示,經(jīng)過(guò)setFlags方法設(shè)置全屏方式。案例代碼package com.yarin.android.Examples_05_13;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;imp
37、ort android.view.Window;import android.view.WindowManager;public class Activity01 extends Activity/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);/* 設(shè)置為無(wú)標(biāo)題欄 */requestWindowFeature(Window.FEATURE_NO_TITLE); /* 設(shè)
38、置為全屏方式 */ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); /* 設(shè)置為橫屏 */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.main);運(yùn)轉(zhuǎn)結(jié)果如下5.2.12 獲得屏幕屬性 市面上手機(jī)款式非常多,而且屏幕大小不一,大家一定希望本人開(kāi)發(fā)的程序能適宜各種屏幕大小的手機(jī)。這就需求我
39、們?cè)陂_(kāi)發(fā)時(shí)不要把一些坐標(biāo)設(shè)置為定值,而是經(jīng)過(guò)計(jì)算得出。這樣不論安裝在什么手機(jī),都不需求做很大的改動(dòng)就能正常顯示。要計(jì)算坐標(biāo)等變量的值,一定需求一個(gè)值作為參考,這里做好的參考值就是屏幕的寬度和高度。 Android 中的DisplayMetrics定義一些屏幕屬性,可以經(jīng)過(guò)getMetrics方法得到當(dāng)前的屏幕的DisplayMetrics屬性,從而獲得屏幕的寬和高下面經(jīng)過(guò)一個(gè)例子詳細(xì)展現(xiàn),詳細(xì)運(yùn)轉(zhuǎn)結(jié)果如下:源代碼如下public void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setConte
40、ntView(R.layout.main);/* 定義DisplayMetrics對(duì)象 */DisplayMetrics dm = new DisplayMetrics();/* 獲得窗口屬性 */getWindowManager().getDefaultDisplay().getMetrics(dm);/* 窗口的寬度 */int screenWidth = dm.widthPixels;/* 窗口的高度 */int screenHeight = dm.heightPixels;mTextView = (TextView) findViewById(R.id.TextView01);mTex
41、tView.setText(屏幕寬度: + screenWidth + n屏幕高度: + screenHeight);5.3 動(dòng)畫實(shí)現(xiàn) Android平臺(tái)提供了兩類動(dòng)畫,一類是Tween動(dòng)畫,即經(jīng)過(guò)對(duì)場(chǎng)景里的對(duì)象不斷進(jìn)展圖像變換平移、旋轉(zhuǎn)、縮放來(lái)產(chǎn)生動(dòng)畫效果;第二類是Frame動(dòng)畫化,及順序播放事先做好的圖像,和電影類似,本節(jié)我們將分別學(xué)習(xí)這兩種動(dòng)畫的實(shí)現(xiàn)原理,最后會(huì)結(jié)合Java ME 開(kāi)發(fā)閱歷講解GIF動(dòng)畫實(shí)現(xiàn)的原理。5.3.1 Tween 動(dòng)畫 首先來(lái)分析 Tween動(dòng)畫,Tween動(dòng)畫經(jīng)過(guò)對(duì)View 的內(nèi)容完成一系列的的圖形變換(包括平移、縮放、旋轉(zhuǎn)、改動(dòng)透明度)來(lái)實(shí)現(xiàn)動(dòng)畫效果。它主要包
42、括以下四種動(dòng)畫效果: Alpha: 漸變透明度動(dòng)畫效果。 Scale: 漸變尺寸伸縮動(dòng)畫效果。 Translate: 畫面轉(zhuǎn)移位置挪動(dòng)動(dòng)畫效果 Rotate: 畫面轉(zhuǎn)移旋轉(zhuǎn)動(dòng)畫效果。 詳細(xì)來(lái)講,Tween動(dòng)畫是經(jīng)過(guò)預(yù)先定義一組指令,這些指令指定了圖形變換的類型、觸發(fā)時(shí)間、繼續(xù)時(shí)間。程序沿著時(shí)間線執(zhí)行這些指令就可以實(shí)現(xiàn)動(dòng)畫效果。因此我們首先需求定義Animation動(dòng)畫對(duì)象,然后設(shè)置該動(dòng)畫的一些屬性,最后經(jīng)過(guò) startAnimation 方法來(lái)開(kāi)場(chǎng)動(dòng)畫。網(wǎng)上的大多數(shù)例子都是以 xml文件的方式配置的 我們這里用代碼實(shí)現(xiàn)一下。其實(shí)能夠也不難就是參數(shù)有些多。下面就引見(jiàn) 各個(gè)動(dòng)畫的屬性: Alpha
43、Animation(float fromAlpha, float toAlpha) 功能:構(gòu)建一個(gè)漸變透明度動(dòng)畫 參數(shù): fromAlpha 為動(dòng)畫起始透明度;toAlpha為動(dòng)畫終了透明度(0.0表示完全透明,1.0表示完全不透明)。 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 功能:構(gòu)建一個(gè)漸變尺寸伸縮動(dòng)畫。 參數(shù):fromX、toX 分別是起始和終了時(shí)X坐標(biāo)上的伸縮尺寸。fromY、toY分別是起始和終了時(shí) Y坐標(biāo)上的伸縮
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖書館網(wǎng)絡(luò)安全評(píng)估手冊(cè)
- 三農(nóng)村電商平臺(tái)搭建方案
- 綠化工程文明施工方案1
- 航天行業(yè)航天器設(shè)計(jì)與制造方案
- 減水劑項(xiàng)目可行性研究報(bào)告
- 項(xiàng)目辦公室設(shè)施使用統(tǒng)計(jì)表
- 家服務(wù)員中級(jí)練習(xí)卷附答案(一)
- 房地產(chǎn)定向開(kāi)發(fā)合同協(xié)議
- 婦產(chǎn)科護(hù)理練習(xí)試題及答案
- 未來(lái)科技發(fā)展趨勢(shì)分析報(bào)告閱讀題
- 2024年10月高等教育自學(xué)考試13015計(jì)算機(jī)系統(tǒng)原理試題及答案
- GB/T 3324-2024木家具通用技術(shù)條件
- 2024秋期國(guó)家開(kāi)放大學(xué)本科《古代小說(shuō)戲曲專題》一平臺(tái)在線形考(形考任務(wù)4)試題及答案
- 血吸蟲病知識(shí)宣傳講座
- 詩(shī)經(jīng)的課件教學(xué)課件
- 人工智能講座模板
- 北師大版高中歷史必修三第17課-14-16世紀(jì)西方人文主義的復(fù)興教學(xué)課件共30張
- 上海中考課內(nèi)文言文必背篇目
- 離職證明(標(biāo)準(zhǔn)模版)
- TJGE 3019-2023 富硒雞蛋標(biāo)準(zhǔn)
- 08J333 建筑防腐蝕構(gòu)造
評(píng)論
0/150
提交評(píng)論