自定義SurfaceView的應用

本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連接:http://www.linuxidc.com/Linux/2011-10/44495p2.htmlinux

總結1:自定義SurfaceView的應用(總結內容來自網絡,稍做整理修改)canvas

1)繼承SurfaceView類並實現SurfaceHolder.Callback接口緩存

2)SurfaceHolder.Callback在底層的Surface狀態發生變化的時候通知View,其接口有:網絡

surfaceCreated(SurfaceHolderholder):當Surface第一次建立後會當即調用該方法。能夠在該方法中作一些與繪製界面相關的初始化工做,通常狀況下都是在新開的的線程來繪製界面。函數

surfaceChanged(SurfaceHolderholder, int format, int width,int height):當Surface的狀態(大小和格式)發生變化的時候會調用該方法,在surfaceCreated調用後該方法數至少會被調用一次。動畫

3)SurfaceHolder 類:用於控制surface的接口,它提供了控制surface 的大小,格式,上面的像素。網站

SurfaceView的getHolder()方法能夠獲取SurfaceHolder對象,Surface 就在SurfaceHolder對象內。雖然Surface保存了當前窗口的像線程

素數據,可是在使用過程當中不直接和Surface打交道,而是由SurfaceHolder的 lockCanvas()方法來獲取Canvas對象,經過在Canvas設計

上繪製內容來修改Surface中的數據。若是Surface不可編輯或則還沒有建立調用該方法會返回null,在 unlockCanvas() 和 lockCanvas()orm

中Surface的內容是不緩存的,因此須要徹底重繪Surface的內容,爲了提升效率只重繪變化的部分則能夠調用lockCanvas(Rectrect)

函數來指定一個rect區域,這樣該區域外的內容會緩存起來。在調用lockCanvas函數獲取Canvas後,SurfaceView會獲取Surface的

一個同步鎖直到調用unlockCanvasAndPost(Canvascanvas)函數才釋放該鎖,這裏的同步機制保證在Surface繪製過程當中不會被改變

(被摧毀、修改)等。

總結2:View與SurfaceView區別及應用場景(總結內容來自網絡,稍做整理修改)

1)SurfaceView是View的子類。

2)View缺少爽緩衝機制,當程序須要更新View上的圖像時,程序必須重繪View上顯示的整張圖片。而SurfaceView類具備雙緩衝機制。還能夠經過CanvaslockCanvas(Rect dirty)鎖定SurfaceView上的Rect劃分的區域,獲取該Surface上的局部Canvas,只更新局部Canvas,效率會高不少 。(對應的實例後面的文章會介紹)

3)本質區別:SurfaceView是在一個新起的單獨線程中能夠從新繪製畫面,而View必須在UI的主線程中更新畫面。

在UI的主線程中更新畫面可能會引起問題,好比更新畫面的時間過長,那麼主UI線程可能會被正在繪圖的方法阻塞。那麼將沒法響應按鍵,觸屏等消息。

使用surfaceView 是在新的線程中更新畫面,因此不會阻塞你的UI主線程。但也引起了另一個問題,就是事件同步。好比觸屏了一下,須要SurfaceView中thread處理,通常就須要有一個event queue的設計來保存touch event,涉及到線程同步,又變得比較複雜。

4)應用場景:若是程序或者遊戲界面的動畫元素較多,並且不少都須要經過定時器(主動更新View)來控制這些動畫元素的移動,最好考慮使用SurfaceView,而不是View。

若是程序界面元素是經過按鍵、觸摸、點擊按鈕(被動更新View)等控制動畫元素,更新頻率較低,採用View就能夠。

相關文章
相關標籤/搜索