官方的定義:html
1.SurfaceView編程
SurfaceView是視圖(View)的繼承類,這個視圖裏內嵌了一個專門用於繪製的Surface。你能夠控制這個Surface的格式和尺寸。Surfaceview控制這個Surface的繪製位置。
surface是縱深排序(Z-ordered)的,這代表它總在本身所在窗口的後面。surfaceview提供了一個可見區域,只有在這個可見區域內 的surface部份內容纔可見,可見區域外的部分不可見。surface的排版顯示受到視圖層級關係的影響,它的兄弟視圖結點會在頂端顯示。這意味者 surface的內容會被它的兄弟視圖遮擋,這一特性能夠用來放置遮蓋物(overlays)(例如,文本和按鈕等控件)。注意,若是surface上面 有透明控件,那麼它的每次變化都會引發框架從新計算它和頂層控件的透明效果,這會影響性能。
你能夠經過SurfaceHolder接口訪問這個Surface.用getHolder()方法能夠獲得這個接口。
surfaceview變得可見時,surface被建立;surfaceview隱藏前,surface被銷燬。這樣能節省資源。若是你要查看 surface被建立和銷燬的時機,能夠重載surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
surfaceview的核心在於提供了兩個線程:UI線程和渲染線程。這裏應注意:
1> 全部SurfaceView和SurfaceHolder.Callback的方法都應該在UI線程裏調用,通常來講就是應用程序主線程。渲染線程所要訪問的各類變量應該做同步處理。
2> 因爲surface可能被銷燬,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之間有效,因此要確保渲染線程訪問的是合法有效的surface。框架
2.SurfaceHolder性能
顯示一個surface的抽象接口,使你能夠控制surface的大小和格式, 以及在surface上編輯像素,和監視surace的改變。這個接口一般經過SurfaceView類實現。spa
3. SurfaceHolder.Callback線程
用戶能夠實現此接口接收surface變化的消息。當用在一個SurfaceView 中時, 它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。設置Callback的方法是SurfaceHolder.addCallback.code
爲何要實現Callback接口呢?由於使用SurfaceView有一個原則,全部的繪圖工做必須得在Surface被建立以後才能開始(Surface---表面,這個概念在圖形編程中經常被提到。基本上咱們能夠吧它當作顯存的一個映射,寫入到Surface的內容能夠被直接複製到顯存從而顯示出來,這使得顯示速度回很是快),而在Surface被銷燬以前必須結束。因此Callback中的surfaceCreated和surfaceDestroyed就成了繪圖處理代碼的邊界。htm
當surface被建立後,系統會自動調用surfaceCreated()方法,咱們一般會在該方法中對與surface相關的資源或對象進行初始化操做。對象
1 public void surfaceCreated(SurfaceHolder holder) { 2 if (!hasSurface) { 3 hasSurface = true; 4 initCamera(holder); 5 } 6 }
當surface被銷燬時,會調用surfaceDestroyed()方法:blog
1 public void surfaceDestroyed(SurfaceHolder holder) { 2 hasSurface = false; 3 }
參見:http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html