我們平時自定義控件很多時候都是繼承View來進(jìn)行UI的繪制站蝠,今天這里說的SurfaceView也是繼承View的控件菱魔,我們的游戲就是需要在SurfaceView來實現(xiàn)减牺,我們先來看看<a >官方文檔</a>吧
SurfaceView是一個提供嵌入視圖層次結(jié)構(gòu)中的專用繪圖面,我們可以控制這個繪圖面的大小和尺寸肥隆,SurfaceView可以控制這個繪圖面在屏幕的正確位置稚失。
繪圖面(其實就是Surface)是縱深排序的惨险,繪圖面總是它自己窗口的后面瓶您,SurfaceView提供了一個可見區(qū)域顯示繪圖面矾屯,繪圖面的內(nèi)容受層次結(jié)構(gòu)影響,繪圖面內(nèi)容的兄弟總是在最頂端件蚕,就是說最后繪制的內(nèi)容可能會覆蓋前面的內(nèi)容排作。這可以用來放置覆蓋如表面上的按鈕,如果繪圖面上面 有透明控件哈雏,那么它的每次變化都會引起框架重新計算它和頂層控件的透明效果衫生,這會影響性能。
訪問底層的表面通過SurfaceHolder接口提供盹愚,這可以通過調(diào)用getholder()獲取接口站故。
繪圖面將被創(chuàng)建為你而SurfaceView的窗口是可見的毅舆;你應(yīng)該實現(xiàn)surfacecreated(SurfaceHolder)和surfacedestroyed(SurfaceHolder)發(fā)現(xiàn)當(dāng)繪圖面被創(chuàng)建和銷毀窗口的顯示和隱藏憋活。
SurfaceView的一個目的是提供一個表面,其中一個輔助線程可以渲染到屏幕上.悦即。如果你要使用這種方式辜梳,你需要知道一些線程的語義:
所有的SurfaceView和SurfaceHolder.Callback的方法都應(yīng)該在UI線程里調(diào)用〔柘回調(diào)方法將從線程運(yùn)行的窗口叫SurfaceView(通常是應(yīng)用程序的主線程)宗挥。因此种蝶,它們需要正確地與繪制線程所接觸的任何狀態(tài)同步.螃征。
由于SurfaceView可能被銷毀透敌,它只在SurfaceHolder.Callback.surfaceCreated()和surfaceDestroyed()之間有效,所以要確保渲染線程訪問的是合法有效的surface淌山。
好吧顾瞻,上面大概是我從來官方文檔看的大概的意思,因為我知道SurfaceView已經(jīng)有很多應(yīng)用都用到了退渗,包括自定義視頻蕴纳,拍照等古毛,所以我相信那些前輩已經(jīng)做得比我好很多,我就直接介紹一下接下來我需要重寫的方法:
<b>1.surfaceCreated()第一次創(chuàng)建繪圖層進(jìn)入的方法稻薇,可以用來做一些資源初始化的事情塞椎。</b>
<b>2.surfaceChanged()當(dāng)surface發(fā)生改變的時候案狠,比如大小的時候觸發(fā),第一次創(chuàng)建的時候也會觸發(fā)骂铁。</b>
<b>3.surfaceDestroyed()銷毀時候觸發(fā)从铲,比如退出當(dāng)前繪圖,退出游戲阱扬,停止線程和資源的釋放。</b>
-----------------我是分割線-----------
再說一下我們需要用的一個類<a >SurfaceHolder</a>
這個東西可以看作是我們的手,一個控制器窃蹋,圖紙準(zhǔn)備好了警没,我們就需要去上面繪制東西,就是通過SurfaceHolder來操控surface杀迹。
<b>1.給SurfaceView當(dāng)前的持有者一個回調(diào)對象树酪。</b>
abstract void addCallback(SurfaceHolder.Callback callback);
<b>2.鎖定畫布,就是在可以畫布上畫東西了垂谢。</b>
abstract Canvas lockCanvas();
<b>3.解鎖畫布疮茄,繪制東西完成后,提交給surface進(jìn)行展現(xiàn)</b>
abstract void unlockCanvasAndPost(Canvas canvas);
總結(jié)
基本上就是這些東西了焚虱,也許你現(xiàn)在就還不太明白懂版,不用擔(dān)心躯畴,因為下一節(jié)開始就正式進(jìn)行游戲繪制了薇芝,也開始正式學(xué)習(xí)canvas的用法以及慢慢去了解它的強(qiáng)大之處,如果你喜歡就點擊喜歡讓我知道你也喜歡Canvas嚷缭。
<b>學(xué)習(xí)就是生活的一種態(tài)度。</b>
<a href="http://www.reibang.com/p/c1480142f536">上一篇</a> <a href="http://www.reibang.com/p/a87a9ed6a8b2">下一篇</a>