界面刷新你不知道的東西

一、概述。

View、SurfaceView、GLSurfaceView、TextureView都可用于顯示視頻、動畫、游戲或其他圖形內容。


二、被動更新畫面。

以游戲舉例,比如棋類,這種用View就好了。因為畫面的更新是依賴于 onTouch 觸摸事件來更新,在UI線程中可以使用 invalidate(),在非UI線程中可以使用postInvalidate()來觸發(fā)。 在這種情況下,這一次Touch和上一次Touch間隔的時間比較長,不會產(chǎn)生影響。


三、主動更新畫面。

以一個人在一直跑動為例。這就需要一個單獨的Thread不停的重繪人的狀態(tài),避免阻塞main UI 線程。所以顯然View不合適,而應該需要用SurfaceView來控制。因為SurfaceView可以在非UI線程中進行界面刷新,繪圖操作在獨立的線程中完成,特別適合于那些需要頻繁更新界面的應用,如視頻播放、游戲等。


四、3D游戲、3D設計、3D展示界面、3D地圖。

為了追求極致的性能和幀率,可以使用GLSurfaceView(繼承自SurfaceView)。其本身就封裝了一些OpenGL ES的API(上下文管理、渲染循環(huán)等復雜操作),配合各個平臺實現(xiàn)的EGL, 通過著色器(OpenGL/OpenGLES(OpenGL for Embedded Systems) Shader Language中的頂點著色器、片元著色器)可以達到很多View難以達到的效果。適合需要復雜3D圖形渲染的應用。


五、SurfaceView與TextureView。

1.SurfaceView和TextureView都繼承自View。

2.SurfaceView在API 1及以上版本可用,TextureView在API 14及以上版本可用。

3.TextureView只能使用在硬件加速窗口中。在用軟件渲染時,TextureView不會繪制任何東西。

4.SurfaceView可在獨立的線程中進行繪制,而TextureView在主線程中進行繪制。

5.SurfaceView窗口刷新的時候不需要重繪應用程序的窗口(Android普通窗口的View繪制機制是一層一層的,任何一個子元素刷新或局部的刷新都會導致整個視圖結構全部重繪一次,因此效率非常低下,不過滿足普通應用界面的需求還是綽綽有余),但是SurfaceView也有一些非常不便的限制。因為SurfaceView的內容不在應用窗口上,是在應用窗口之外的一個獨立的繪圖表面Surface(顯示在應用程序窗口之上)上進行繪制,所以不能使用變換(平移(Translate)、縮放(Scale)、旋轉(Rotate)、傾斜(Skew)等)。所以如果是對于視頻播放器、OpenGL場景或者相機應用的開發(fā),TextureView更加適合。

6.SurfaceView繪制在獨立的層上,不支持透明度、動畫效果和變換。

TextureView支持透明度、動畫效果和變換。

7.TextureView的性能低于SurfaceView,,因為它涉及額外的緩沖區(qū)和可能的同步開銷。

8.SurfaceView使用雙緩沖機制,在一個獨立的窗口進行繪制,所以在某些設備上,SurfaceView的內容可能在窗口切換時丟失。而TextureView將內容繪制在一個普通的View上,不需要獨立的窗口,因此不會出現(xiàn)內容丟失的問題。







微風不燥,陽光正好,你就像風一樣經(jīng)過這里,愿你停留的片刻溫暖舒心。

我是程序員小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等編程技術的技巧經(jīng)驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們?yōu)槟峁椭淖畲髣恿Α?/p>

歡迎關注。助您在編程路上越走越好!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容