SurfaceView類是一個用於處理Surface的視圖,也是Android API提供的另一個類。
什麼是Surface?它是一個抽象的原是緩沖區,被屏幕組合器用於渲染特定視圖。屏幕組合器是Android上所有渲染的幕後推手,並最終負責將所有的像素點推送到GPU。
我們的目標就是在一個獨立的線程中執行渲染,而不用大量占用UI線程,因為UI線程還有很多工作要做。SurfaceView類提供了一種在UI線程之外的線程中進行渲染的方式。
SurfaceHolder和鎖定
為了在UI線程之外的另一個不同線程中渲染到SurfaceView,我們需要獲得一個SurfaceHolder類的實例,如下所示:
SurfaceHolder holder = surfaceView.getHolder();
SurfaceHolder是Surface的一個包裝,可為我們做一些輔助工作。它提供兩個方法:
Canvas SurfaceHolder.lockCanvas();
SurfaceHolder.unlockAndPost(Canvas canvas);
第一個方法鎖定Surface用於渲染並返回一個可用的Canvas實例。第二個方法解鎖Surface並確保通過Canvas進行繪制的內容可顯示在屏幕上。我們將在渲染線程中使用這兩個方法以獲取Canvas,通過它進行渲染並最終確保我們渲染的圖像能在屏幕上可見。我們必須確保傳遞到SurfaceHolder.unlockAndPost()方法的Canvas與從SurfaceHolder.lockCanvas()方法接收的相同。
當SurfaceView被實例化時,Surface並沒有立即創建。相反,它是異步創建的。每當活動暫停或再次恢復而重新創建時,該Surface都將被銷毀。
Surface的創建與有效性
只要Surface沒有生效,我們就不能從SurfaceHolder中獲取Canvas。不過,我們可以通過下面的語句來查看Surface是否已被創建:
boolean isCreated = surfaceHolder.getSurface().isValid();
如果該方法返回true,我們就可安全的鎖定該Surface並通過接收到的Canvas來在其上進行繪制。我們必須絕對確保在調用SurfaceHolder.lockCanvas()之後再次解鎖Surface,否則我們的活動可能會鎖定手機。