surfaceView和View最本質的區別在于:?
---------------------------------------------------------------------------------------------------
surfaceView是在一個新起的單獨線程中可以重新?
繪制畫面,而View必須在UI的主線程中更新畫面。那么在UI的主線程中更新畫面可能會引發?
問題,比如你更新畫面的時間過長,那么你的主UI線程會被你正在畫的函數阻塞。 那么將無
法響應按鍵,觸屏等消息。當使用surfaceView 由于是在新的線程中更新畫面所以不會阻塞
你搜索的UI主線程。但這也帶來了另外一個問題 ,就是事件同步。比如你觸屏了一下,你需
要surfaceView中 thread處理,一般就需要有一個event queue的設計來保存touchevent,
這會稍稍復雜一點,因為涉及到線程同步。
所以基于以上,根據游戲特點,一般分成 兩類。
----------------------------------------------------------------------------------------------------
1 被動更新畫面的。比如棋類,這種用view就好了。因為畫面的更新是依賴于 onTouch 來更
新,可以直接使用 invalidate。 因為這種情況下,這一次Touch和下一次的Touch需要的時間
比較長些,不會產生影響。
2 主動更新。比如一個人在一直跑動。這就需要一個單獨的thread不停的重繪人的狀態,避免
阻 塞main UI thread。所以顯然view不合適,需要surfaceView來控制。
SurfaceView簡介
----------------------------------------------------------------------------------------------------
在一般的情況 下,應用程序的View都是在相同的GUI線程中繪制的。這個主應用程序線程同時
也用來處理所 有的用戶交互(例如,按鈕單擊或者文本輸入)。我們已經學習了如何把容易阻塞的?
處理移動到后臺線程中。遺憾的是,對于一個View的onDraw方法,不能這樣做,因為從后臺線
程 修改一個GUI元素會被顯式地禁止的。當需要快速地更新View的UI,或者當渲染代碼阻塞 GUI
線程的時間過長的時候,SurfaceView就是解決上述問題的最佳選擇。?
SurfaceView封裝了一個Surface對象,而不是Canvas。這一點很重要,因為Surface可以使用后?
臺線程繪制。對于那些資源敏感的 操作,或者那些要求快速更新或者高速幀率的地方,例如,使
用3D圖形,創建游戲,或者實時預覽攝像頭,這一點特別有用。獨立于GUI線程進行繪圖的代價
是額外的內存消耗,所以,雖然它是創建定制的View的有效方式--有時甚至是必須的,但是使用
SurfaceView的時候仍然要保持謹慎。
1. 何時應該使用SurfaceView?
SurfaceView使用的方式與任何View所派生的類都是完全相同 的。可以像其他View那樣應用動畫
,并把它們放到布局中。SurfaceView封裝的Surface支持使用所有標準Canvas方法進行繪圖,同
時也支持完全的OpenGL ES庫。使用OpenGL,你可以再Surface上繪制任何支持的2D或者3D對象
,與在2D畫布上模擬 相同的效果相比,這種方法可以依靠硬件加速(可用的時候)來極大地提高性能。
對于顯示動態的3D圖像來說,例如,那些使用Google Earth功能的應用程序,或者那些提供沉浸體
驗的交互式游戲,SurfaceView特別有用。它還是 實時顯示攝像頭預覽的最佳選擇。
2. 創建一個新的SurfaceView控件
要創建一個新的SurfaceView,需要創建一個新的擴展了SurfaceView的類,并實現SurfaceHolder.Callback。
SurfaceHolder回調可以在底層的Surface被創建和銷毀的時候通知View,并傳遞給它對SurfaceHolder
對象的引用,其中包含了當 前有效的Surface。一個典型的SurfaceView設計模型包括一個由Thread
所派生的類,它可以接收對當前的SurfaceHolder的引用,并獨 立地更新它。
---------------------------------------------------------------------------------------------------
surfaceView是在一個新起的單獨線程中可以重新?
繪制畫面,而View必須在UI的主線程中更新畫面。那么在UI的主線程中更新畫面可能會引發?
問題,比如你更新畫面的時間過長,那么你的主UI線程會被你正在畫的函數阻塞。 那么將無
法響應按鍵,觸屏等消息。當使用surfaceView 由于是在新的線程中更新畫面所以不會阻塞
你搜索的UI主線程。但這也帶來了另外一個問題 ,就是事件同步。比如你觸屏了一下,你需
要surfaceView中 thread處理,一般就需要有一個event queue的設計來保存touchevent,
這會稍稍復雜一點,因為涉及到線程同步。
所以基于以上,根據游戲特點,一般分成 兩類。
----------------------------------------------------------------------------------------------------
1 被動更新畫面的。比如棋類,這種用view就好了。因為畫面的更新是依賴于 onTouch 來更
新,可以直接使用 invalidate。 因為這種情況下,這一次Touch和下一次的Touch需要的時間
比較長些,不會產生影響。
2 主動更新。比如一個人在一直跑動。這就需要一個單獨的thread不停的重繪人的狀態,避免
阻 塞main UI thread。所以顯然view不合適,需要surfaceView來控制。
SurfaceView簡介
----------------------------------------------------------------------------------------------------
在一般的情況 下,應用程序的View都是在相同的GUI線程中繪制的。這個主應用程序線程同時
也用來處理所 有的用戶交互(例如,按鈕單擊或者文本輸入)。我們已經學習了如何把容易阻塞的?
處理移動到后臺線程中。遺憾的是,對于一個View的onDraw方法,不能這樣做,因為從后臺線
程 修改一個GUI元素會被顯式地禁止的。當需要快速地更新View的UI,或者當渲染代碼阻塞 GUI
線程的時間過長的時候,SurfaceView就是解決上述問題的最佳選擇。?
SurfaceView封裝了一個Surface對象,而不是Canvas。這一點很重要,因為Surface可以使用后?
臺線程繪制。對于那些資源敏感的 操作,或者那些要求快速更新或者高速幀率的地方,例如,使
用3D圖形,創建游戲,或者實時預覽攝像頭,這一點特別有用。獨立于GUI線程進行繪圖的代價
是額外的內存消耗,所以,雖然它是創建定制的View的有效方式--有時甚至是必須的,但是使用
SurfaceView的時候仍然要保持謹慎。
1. 何時應該使用SurfaceView?
SurfaceView使用的方式與任何View所派生的類都是完全相同 的。可以像其他View那樣應用動畫
,并把它們放到布局中。SurfaceView封裝的Surface支持使用所有標準Canvas方法進行繪圖,同
時也支持完全的OpenGL ES庫。使用OpenGL,你可以再Surface上繪制任何支持的2D或者3D對象
,與在2D畫布上模擬 相同的效果相比,這種方法可以依靠硬件加速(可用的時候)來極大地提高性能。
對于顯示動態的3D圖像來說,例如,那些使用Google Earth功能的應用程序,或者那些提供沉浸體
驗的交互式游戲,SurfaceView特別有用。它還是 實時顯示攝像頭預覽的最佳選擇。
2. 創建一個新的SurfaceView控件
要創建一個新的SurfaceView,需要創建一個新的擴展了SurfaceView的類,并實現SurfaceHolder.Callback。
SurfaceHolder回調可以在底層的Surface被創建和銷毀的時候通知View,并傳遞給它對SurfaceHolder
對象的引用,其中包含了當 前有效的Surface。一個典型的SurfaceView設計模型包括一個由Thread
所派生的類,它可以接收對當前的SurfaceHolder的引用,并獨 立地更新它。