網頁

2022年3月17日 星期四

Android Studio - SurfaceView 基本(六十八)

Android Studio - SurfaceView 基本(六十八):

SurfaceView 是 Android 中一種比較特殊的視圖,它與視圖容器並不是在同一個視圖層上,繪製在一個獨立的執行緒中完成,不需要及時回應使用者的輸入,也不會造成回應的 ANR 問題。SurfaceView 一般用在遊戲、視頻、攝影等一些複雜 UI 且高效的圖像的顯示,這類的影像處理都需要開單獨的執行緒來處理。所有 SurfaceView 和 SurfaceHolder.Callback 方法都將從運行 SurfaceView 窗口的線程(通常是應用程序的主線程)中調用。 因此,它們需要與繪圖線程也觸及的任何狀態正確同步。必須確保繪圖線程僅在其有效時接觸底層 Surface在 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 之間。

Android SurfaceView 流程

View 和 SurfaceView 的區別:
  1. View 適用于主動更新的情況,而 SurfaceView 則適用于被動更新的情況,比如頻繁刷新介面。
  2. View 在主執行緒中對頁面進行刷新,而 SurfaceView 則開啟一個子執行緒來對頁面進行刷新。
  3. View 在繪圖時沒有實現雙緩衝機制,SurfaceView 在底層機制中就實現了雙緩衝機制。

關鍵介面 Callback:
  • Callback 是 SurfaceHolder 內部的一個介面,介面中有以下三個方法
  • public void surfaceCreated(SurfaceHolder holder):Surface 第一次創建時被調用,例如 SurfaceView 從不可見狀態到可見狀態 。在這個方法被調用到 surfaceDestroyed 方法被調用之前,Surface 物件可以被操作。也就是說,在介面可見的情況下,可以對 SurfaceView 進行繪製。
  • public void surfaceChanged(SurfaceHolder holder, int format, int width, int height):Surface 大小和格式改變時會被調用,例如橫豎屏切換時,如果需要對 Surface 的圖像進行處理,就需要在這裡實現。這個方法在 surfaceCreated 之後至少會被調用一次 。
  • public void surfaceDestroyed(SurfaceHolder holder):Surface 被銷毀時被調用,例如 SurfaceView 從可見到不可見狀態時。 在這個方法被調用過之後,不能夠再對 Surface 物件進行任何操作,所以繪圖執行緒不能再對 SurfaceView 進行操作。

SurfaceView 的使用方法:
  1. 實現 SurfaceHolder.Callback 介面
  2. 在 SurfaceHolder.Callback 的 surfaceCreated 方法中開啟一個執行緒進行圖像的繪製
  3. 在 SurfaceHolder.Callback 的 surfaceDestroyed 方法中,結束繪製執行緒並調用 SurfaceHolder 的 removeCallbck 方法
  4. 在繪製執行緒每幀開始之前,調用 lockCanvas 方法鎖住畫布進行繪圖
  5. 繪製完一幀的資料之後,調用 unlockCanvasAndPost 方法提交資料來顯示圖像
2022年 3月 17日(Thu)天氣報告
氣溫:43.0°F / 6.0°C @ 07:00
風速:每小時 6公里
降雨機會:36%
相對濕度:百分之 86%
天氣:多雲時陰

沒有留言:

張貼留言