最近接觸到了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.
看完官方的介紹,明白了許多,surfaceView帶z-order的,還可以在上面操作像素有木有,還有單獨的渲染線程哦親。如果做遊戲開發,當然選SurfaceView了。