999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

SurfaceView在Android游戲開發中的研究

2014-09-16 01:52:37易國平
學周刊·下旬刊 2014年6期

易國平

摘要:目前,Android平臺的市場份額已經躍居全球第一,其平臺的開發性讓越來越多的人加入Android平臺的游戲開發。在游戲開發,程序運行的元素越來越多,要讓程序員自己控制刷新屏幕,就需用到類庫SurfaceView。因此SurfaceView在游戲開發中尤為重要,本文就SurfaceView在開發中用到的相關屬性和方法做詳細說明,以幫助大家對SurfaceView快速的了解。

關鍵詞:Android SurfaceView 游戲開發

近年來,Android平臺越來越火爆,其市場份額已占全球第一。隨著科技水平的進步和android平臺的領先,Android的游戲開發是程序員的新的發展方向。Android普通程序開發的UI線程更新畫面,是由程序后臺控制,這是被動更新畫面。簡單的棋牌類游戲開發可以,但是實時互動的游戲就需要自我掌控屏幕的刷新。而SurfaceView類就是在這種情況產生的,它在一個新啟動的線程中重新繪制畫面,主動更新畫面。

一、SurfaceView簡介

說到SurfaceView類,就需要先介紹下它的父類View,View一般在onDraw方法里面繪圖,onDraw在UI主線程執行。onDraw默認只在View初始化的時候調用一遍,所以View不會自動刷新畫面,一般要調用invalidate或者postInvalidate來重新執行onDraw里面的代碼進行刷新畫面。SurfaceView也可以在onDraw方法里面繪圖,即直接在UI主線程繪圖并渲染,因為SurfaceView是View的子類。上面已經介紹,繪圖完畢后只能在UI主線程內渲染到屏幕上。為了不阻塞主線程,我們可以考慮采取這樣的方案:在后臺線程執行繁重的繪圖任務,把所繪制的東西緩存起來;繪圖完畢后,再回到UI主線程,一次性把所繪制的東西渲染到屏幕上。(本質就是后臺線程繪圖,UI主線程渲染)只使用View的onDraw方法是無法實現這種方案的,而SurfaceView可以實現這種方案。

先看看SurfaceView的工作原理圖:

首先,SurfaceView使用Canvas對象進行繪圖;由圖可以看出,Canvas在后臺線程繪制的東西先緩存到Surface中。其次,讓Surface回到UI主線程渲染到屏幕上。因此,要有Surface對象存在,才能夠在屏幕上顯示圖案。

二、SurfaceView在代碼中各成員解釋

(一)Surface與SurfaceHolder對象

Surface是SurfaceView里面的一個成員變量,它的創建和銷毀過程都是自動的。Surface的主要作用是緩存Canvas繪制的東西,并渲染到屏幕上。SurfaceHolder對象通過類SurfaceView的getHolder()函數獲得。

(二)后臺繪圖線程的開啟與銷毀

在Surface被創建的時候,開啟繪圖線程。在Surface被銷毀的時候,銷毀繪圖線程。因為沒有Surface,繪制再多的東西也無法渲染到屏幕上。既然要在創建Surface時開啟繪圖線程,在銷毀Surface時銷毀繪圖線程。那就需要監聽Surface的生命周期,使用SurfaceHolder對象的addCallback()來添加Surface的生命周期監聽器——SurfaceHolder.Callback

(三)Callback的成員函數

1.Surface的大小發生改變時調用surfaceChanged

2.Surface創建時調用,一般在這里開啟繪圖線程surfaceCreated

3.Surface銷毀時調用,一般在這里銷毀繪圖線程surfaceDestroyed

三、實例的具體實現步驟及代碼實現

(一)1SurfaceView使用步驟

1.新建一個繼承SurfaceView的類——GameView

2.得到SurfaceHolder對象,并監聽Surface的生命周期

3.開啟繪圖線程、銷毀繪圖線程

4.在run方法中嘗試進行繪圖

5.動態刷新屏幕

(二)具體代碼實現:

1.MainActivity,主要Activity

class MainActivity extends Activity {

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(new MyView(this));

2.MySurfaceView

class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

SurfaceHolder holder;

public MyView(Context context) {

super(context);

holder = this.getHolder();//獲取holder

holder.addCallback(this);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }

@Override

public void surfaceCreated(SurfaceHolder holder) {

new Thread(new MyThread()).start();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) { }

}

3.MyThread

class MyThread implements Runnable{

@Override

public void run() {

Canvas canvas = holder.lockCanvas(null);//

獲取畫布

Paint mPaint = new Paint();

mPaint.setColor(Color.BLUE);

canvas.drawRect(new RectF(40,60,80,80), mPaint);

holder.unlockCanvasAndPost(canvas);//解鎖畫布,提交畫好的圖像

}

}

本文對Android系統的游戲開中的SurfaceView類進行了分析,對于SurfaceView在游戲開發中與View的區別做了簡單說明,最后給出一個簡單的例子作為學習的樣例,為能夠給游戲開發人員提供一點啟示。

參考文獻:

[1](美)Shane Conder(美)Lauren Darcey .Android移動應用開發入門到精通人民郵電出版社,2010.

[2]胡必波.基于Android系統的手機游戲設計與實現[D]. 華南理工大學.

(責編 張景賢)

主站蜘蛛池模板: 久久婷婷五月综合97色| 精品国产www| 欧美综合区自拍亚洲综合绿色| 欧美一级在线| 国产成人麻豆精品| 国产国产人免费视频成18| 黄色网址手机国内免费在线观看| 波多野结衣爽到高潮漏水大喷| 色呦呦手机在线精品| 亚洲色成人www在线观看| 免费观看国产小粉嫩喷水| 亚洲区视频在线观看| 亚洲精品国产成人7777| 亚洲精品国产综合99| 亚洲国产欧美目韩成人综合| 亚洲成人一区二区| 好久久免费视频高清| 国产99免费视频| 亚洲啪啪网| 色播五月婷婷| 久久久久九九精品影院| 18禁黄无遮挡网站| 中文成人无码国产亚洲| 一本一道波多野结衣一区二区| 激情六月丁香婷婷| 亚洲天堂久久新| 欧美第一页在线| 手机在线看片不卡中文字幕| 亚洲精品在线观看91| 国内精品自在欧美一区| 内射人妻无套中出无码| 欧美69视频在线| 波多野结衣爽到高潮漏水大喷| 国产AV无码专区亚洲A∨毛片| 欧美黄网站免费观看| 久久网欧美| 国产成人AV男人的天堂| 免费看美女自慰的网站| 成人福利在线观看| 嫩草影院在线观看精品视频| 亚洲精品无码抽插日韩| 青青青视频免费一区二区| 婷婷色狠狠干| 精品成人一区二区三区电影 | 中国黄色一级视频| 狠狠久久综合伊人不卡| 久久婷婷五月综合97色| 欧美激情第一区| 四虎影视国产精品| 无码国内精品人妻少妇蜜桃视频| 久热精品免费| 久久窝窝国产精品午夜看片| 国产后式a一视频| 久久6免费视频| 亚洲成av人无码综合在线观看| 国产美女在线观看| 茄子视频毛片免费观看| 88国产经典欧美一区二区三区| 22sihu国产精品视频影视资讯| 亚洲AV色香蕉一区二区| 99久久人妻精品免费二区| 日韩av在线直播| 欧美精品H在线播放| 亚洲性网站| 久久久精品国产SM调教网站| 国产欧美日韩专区发布| 福利国产在线| 国产剧情无码视频在线观看| 99久久国产综合精品2023| 97久久超碰极品视觉盛宴| 亚洲美女操| 国产青榴视频在线观看网站| 最新国产网站| 青青国产视频| 国产69精品久久| 国产黄色免费看| 亚洲综合精品香蕉久久网| 天天操天天噜| 中文字幕欧美日韩高清| 免费观看成人久久网免费观看| 91免费观看视频| 欧美国产中文|