Android關於SurfaceView,SurfaceHolder,SurfaceHolder.CallBack詳解


官方的定義:

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類實現。

3. SurfaceHolder.Callback

  用戶可以實現此接口接收surface變化的消息。當用在一個SurfaceView 中時,  它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之間有效。設置Callback的方法是SurfaceHolder.addCallback.

  為什么要實現Callback接口呢?因為使用SurfaceView有一個原則,所有的繪圖工作必須得在Surface被創建之后才能開始(Surface---表面,這個概念在圖形編程中常常被提到。基本上我們可以吧它當做顯存的一個映射,寫入到Surface的內容可以被直接復制到顯存從而顯示出來,這使得顯示速度回非常快),而在Surface被銷毀之前必須結束。所以Callback中的surfaceCreated和surfaceDestroyed就成了繪圖處理代碼的邊界。

  當surface被創建后,系統會自動調用surfaceCreated()方法,我們通常會在該方法中對與surface相關的資源或對象進行初始化操作。

1 public void surfaceCreated(SurfaceHolder holder) {
2         if (!hasSurface) {
3             hasSurface = true;
4             initCamera(holder);
5         }
6     }

  當surface被銷毀時,會調用surfaceDestroyed()方法:

1 public void surfaceDestroyed(SurfaceHolder holder) {
2    hasSurface = false;
3 }

  

參見:http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM