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