亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        SurfaceView在Android游戲開(kāi)發(fā)中的研究

        2014-09-16 01:52:37易國(guó)平
        學(xué)周刊·下旬刊 2014年6期

        易國(guó)平

        摘要:目前,Android平臺(tái)的市場(chǎng)份額已經(jīng)躍居全球第一,其平臺(tái)的開(kāi)發(fā)性讓越來(lái)越多的人加入Android平臺(tái)的游戲開(kāi)發(fā)。在游戲開(kāi)發(fā),程序運(yùn)行的元素越來(lái)越多,要讓程序員自己控制刷新屏幕,就需用到類(lèi)庫(kù)SurfaceView。因此SurfaceView在游戲開(kāi)發(fā)中尤為重要,本文就SurfaceView在開(kāi)發(fā)中用到的相關(guān)屬性和方法做詳細(xì)說(shuō)明,以幫助大家對(duì)SurfaceView快速的了解。

        關(guān)鍵詞:Android SurfaceView 游戲開(kāi)發(fā)

        近年來(lái),Android平臺(tái)越來(lái)越火爆,其市場(chǎng)份額已占全球第一。隨著科技水平的進(jìn)步和android平臺(tái)的領(lǐng)先,Android的游戲開(kāi)發(fā)是程序員的新的發(fā)展方向。Android普通程序開(kāi)發(fā)的UI線程更新畫(huà)面,是由程序后臺(tái)控制,這是被動(dòng)更新畫(huà)面。簡(jiǎn)單的棋牌類(lèi)游戲開(kāi)發(fā)可以,但是實(shí)時(shí)互動(dòng)的游戲就需要自我掌控屏幕的刷新。而SurfaceView類(lèi)就是在這種情況產(chǎn)生的,它在一個(gè)新啟動(dòng)的線程中重新繪制畫(huà)面,主動(dòng)更新畫(huà)面。

        一、SurfaceView簡(jiǎn)介

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

        先看看SurfaceView的工作原理圖:

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

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

        (一)Surface與SurfaceHolder對(duì)象

        Surface是SurfaceView里面的一個(gè)成員變量,它的創(chuàng)建和銷(xiāo)毀過(guò)程都是自動(dòng)的。Surface的主要作用是緩存Canvas繪制的東西,并渲染到屏幕上。SurfaceHolder對(duì)象通過(guò)類(lèi)SurfaceView的getHolder()函數(shù)獲得。

        (二)后臺(tái)繪圖線程的開(kāi)啟與銷(xiāo)毀

        在Surface被創(chuàng)建的時(shí)候,開(kāi)啟繪圖線程。在Surface被銷(xiāo)毀的時(shí)候,銷(xiāo)毀繪圖線程。因?yàn)闆](méi)有Surface,繪制再多的東西也無(wú)法渲染到屏幕上。既然要在創(chuàng)建Surface時(shí)開(kāi)啟繪圖線程,在銷(xiāo)毀Surface時(shí)銷(xiāo)毀繪圖線程。那就需要監(jiān)聽(tīng)Surface的生命周期,使用SurfaceHolder對(duì)象的addCallback()來(lái)添加Surface的生命周期監(jiān)聽(tīng)器——SurfaceHolder.Callback

        (三)Callback的成員函數(shù)

        1.Surface的大小發(fā)生改變時(shí)調(diào)用surfaceChanged

        2.Surface創(chuàng)建時(shí)調(diào)用,一般在這里開(kāi)啟繪圖線程surfaceCreated

        3.Surface銷(xiāo)毀時(shí)調(diào)用,一般在這里銷(xiāo)毀繪圖線程surfaceDestroyed

        三、實(shí)例的具體實(shí)現(xiàn)步驟及代碼實(shí)現(xiàn)

        (一)1SurfaceView使用步驟

        1.新建一個(gè)繼承SurfaceView的類(lèi)——GameView

        2.得到SurfaceHolder對(duì)象,并監(jiān)聽(tīng)Surface的生命周期

        3.開(kāi)啟繪圖線程、銷(xiāo)毀繪圖線程

        4.在run方法中嘗試進(jìn)行繪圖

        5.動(dòng)態(tài)刷新屏幕

        (二)具體代碼實(shí)現(xiàn):

        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);//

        獲取畫(huà)布

        Paint mPaint = new Paint();

        mPaint.setColor(Color.BLUE);

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

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

        }

        }

        本文對(duì)Android系統(tǒng)的游戲開(kāi)中的SurfaceView類(lèi)進(jìn)行了分析,對(duì)于SurfaceView在游戲開(kāi)發(fā)中與View的區(qū)別做了簡(jiǎn)單說(shuō)明,最后給出一個(gè)簡(jiǎn)單的例子作為學(xué)習(xí)的樣例,為能夠給游戲開(kāi)發(fā)人員提供一點(diǎn)啟示。

        參考文獻(xiàn):

        [1](美)Shane Conder(美)Lauren Darcey .Android移動(dòng)應(yīng)用開(kāi)發(fā)入門(mén)到精通人民郵電出版社,2010.

        [2]胡必波.基于Android系統(tǒng)的手機(jī)游戲設(shè)計(jì)與實(shí)現(xiàn)[D]. 華南理工大學(xué).

        (責(zé)編 張景賢)

        国产视频一区二区三区久久亚洲| 狠狠久久亚洲欧美专区| 亚洲午夜成人片| 久久狠狠髙潮曰十八女人| 中文字幕在线亚洲三区| 国产成人无码免费视频在线 | 亚洲一二三四五区中文字幕| 美腿丝袜在线观看视频| 日韩av无码中文无码电影| 人妻av一区二区三区精品| a级毛片内射免费视频| 有码精品一二区在线| 青青草针对华人超碰在线| 亚洲一区二区三区偷拍女| 小妖精又紧又湿高潮h视频69| 野花社区视频在线观看 | 一本加勒比hezyo无码视频| 国产一品二品三品精品久久| 国产熟女盗摄一区二区警花91| 久久不见久久见中文字幕免费| 日韩精品电影在线观看| 亚洲精品一区二区三区日韩| 激情人妻另类人妻伦| 国产成人精品日本亚洲11 | 一区二区三区精彩视频在线观看| 一区二区三区字幕中文| 少妇做爰免费视频网站| 无码在线观看123| 亚洲综合综合在线| 高清不卡日本v二区在线| 欧美性xxxx极品高清| 日韩另类在线| 日韩av综合色区人妻| 国产一区二区三区小说| 亚洲不卡中文字幕无码| 亚洲国产成人精品激情资源9| 深夜日韩在线观看视频| 国产人妻大战黑人20p| 亚洲国产成人久久一区www| 亚洲欧美日韩高清中文在线| 中文字幕这里都是精品|