SurfaceView
SurfaceView 是一個能夠在子線程中更新 UI 的 View,且不會影響到主線程。微信
它爲本身建立了一個窗口(window),就好像在視圖層次(View Hierarchy)上穿了個「洞」,讓繪圖層(Surface)直接顯示出來。app
可是,和常規視圖(view)不一樣,它沒有動畫或者變形特效,一些 View 的特性也沒法使用。編輯器
歸納:學習
SurfaceView 獨立於視圖層次(View Hierarchy),擁有本身的繪圖層(Surface),但也沒有一些常規視圖(View)的特性,如動畫等。flex
SurfaceView 的實現中具備兩個繪圖層(Surface),即咱們所說的雙緩衝機制。咱們的繪製發生在後臺畫布上,並經過交換先後臺畫布來刷新畫面,可避免局部刷新帶來的閃爍,也提升了渲染效率。動畫
SurfaceView 中的 SurfaceHolder 是 Surface 的持有者和管理控制者。google
SurfaceHolder.Callback 的各個回調發生在主線程。url
GLSurfaceView
GLSurfaceView 繼承 SurfaceView,除了擁有 SurfaceView 全部特性外,還加入了 EGL(EGL 是 OpenGL ES 和原生窗口系統之間的橋樑) 的管理,並自帶了一個單獨的渲染線程。spa
歸納:.net
繼承自 SurfaceView,擁有其全部特性。
加入了 EGL 管理,是 SurfaceView 應用 OpenGL ES 的典型場景。
有單獨的渲染線程 GLThread。
單獨出了 Renderer 接口負責實際渲染,不一樣的 Renderer 實現至關於不一樣的渲染策略,使用方式靈活(策略模式)。
SurfaceTexture
Android 3.0(API 11)新加入的一個類,不一樣於 SurfaceView 會將圖像顯示在屏幕上,SurfaceTexture 對圖像流的處理並不直接顯示,而是轉爲 GL 外部紋理。
歸納:
SurfaceTexture 能夠從圖像流(相機、視頻)中捕獲幀數據用做 OpenGL ES 外部紋理(GL_TEXTURE_EXTERNAL_OES),實現無縫鏈接。
咱們能夠很方便的對這個外部紋理進行二次處理(如添加濾鏡等)。
輸出目標是 Camera 或 MediaPlayer 時,能夠用 SurfaceTexture 代替 SurfaceHolder,這樣圖像流將把全部幀傳給 SurfaceTexture 而不是顯示在設備上。
使用 updateTexImage() 方法更新最新的圖像。
TextureView
TextureView 是 Android 4.0(API 14)引入,它必須使用在開啓了硬件加速的窗體中。
除了擁有 SurfaceView 的特性外,它還能夠進行像常規視圖(View)那樣進行平移、縮放等動畫。
歸納:
必須開啓硬件加速(這個默認就是開啓的)。
能夠像常規視圖(View)那樣使用它,包括進行平移、縮放等操做。
TextureView 重載了 draw() 方法,主要是使用 SurfaceTexture 中收到的圖像數據做爲紋理更新到對應的 HardwareLayer 中。
經過 SurfaceTextureListener 接口讓使用者知道 SurfaceTexture 的各類狀態。
SurfaceView 對比 TextureView
SurfaceView | TextureView | |
---|---|---|
內存 | 較低 | 較高 |
繪製 | 及時 | 1-3 幀延遲 |
耗電 | 較低 | 較高 |
動畫和截圖 | 不支持 | 支持 |
本文連接:https://blog.csdn.net/afei__/article/details/100023701
做者:阿飛__
-- END --
進技術交流羣,掃碼添加個人微信:Byte-Flow
獲取視頻教程和源碼
推薦:
FFmpeg + OpenGL ES 實現 3D 全景播放器
FFmpeg + OpenGLES 實現視頻解碼播放和視頻濾鏡
以爲不錯,點個在看唄~
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - 字節流動(google_developer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。