让一个图片填满一个控件_如何在Android中实现一个全景图控件(二)
一、背景
在 如何在Android中實現一個全景圖控件(一)中,介紹了項目的一些基本情況(有 demo 演示),如果項目對你有幫助,希望文章賞個贊,項目 star 一下。項目地址:https://github.com/androidZzT/VRPanoramaView
這篇中,我打算完整的介紹一下項目中用到的技術棧,以及一個全景圖繪制到 Android 屏幕上的大致流程是什么。廢話不多說,我們開始
二、全景圖控件要用哪些技術?
我們先說一說全景圖控件的實現思路是什么?
1. 全景圖控件要做什么?
平時用手機相機的全景模式,可以記錄前后左右 180° 的場景,由于鏡頭限制,可能上下方向的記錄不到,所以這種照片其實是缺失某個方向的信息的,全景圖控件不是用于顯示這種“全景圖”的。
專業全景相機是可以記錄上下左右 360° 的場景,可以把三維場景記錄成一張二維的圖片,所以全景圖控件要做的是把二維的圖像還原成為拍攝現場的三維場景。
2. 怎樣在二維屏幕上還原一個三維場景?
圖1-全景圖控件實現思路
如圖所示:
3. 如何在屏幕中畫一個球?
圖2-3D渲染的大致過程
平時 Android 開發中使用的 View 大多都是 2D 的,現在我們需要繪制出一個 3D 的 View,要用到哪些技術呢?
如圖,由左向右是渲染全景圖的一個大致流程: 1. Bitmap 輸入到虛線框里的 TextureView(其中虛線框的內容完全可以用 GLSurfaceView 代替,后續解釋細節的時候會說明)。 2. TextureView 生成了 SurfaceTexture 3. SurfaceTexture 和 EGL 共同生成了 GLContext 4. GLThread 綁定 GLContext 5. 通過 GLThread 調用 OpenGL api,以及 EGL api 6. 全景圖輸出到屏幕
不清楚流程中這些概念的同學可能一臉懵逼,這都是啥???下面,我來一一簡單解釋一下
3.1 EGL 是什么?
EGL 是 OpenGL ES 渲染 API 和本地窗口系統(native platform window system)之間的一個中間接口層我的理解是,OpenGL 和屏幕硬件打交道的中間層,想要通過 OpenGL 將一些內容繪制到屏幕,必須通過 EGL
3.2 GLContext 和 GLThread 是什么?
GLContext 是調用 OpenGL Api 必須的上下文環境,其主要有 SurfaceTexture 和 EGL 的一些內容組成。調用 OpenGL api 的時候如果沒有環境,則會失敗。
GLThread 其實就是一條普通的線程,只是綁上了 GLContext 后,就叫 GLThread 了
3.3 SurfaceTexture
Captures frames from an image stream as an OpenGL ES texture。把一張圖片作為 OpenGL ES 紋理這個類的作用我沒有深入研究,目前知道的是,SurfaceTexture 是 TextureView 和 EGL 之間通信的橋梁,想要通過 TextureView 調用 OpenGL,SurfaceTexture 也是必不可少的。
3.4 再看整體流程
大概知道每個環節的感念后,再看一下流程會感覺稍微清晰一點。
當然,技術細節遠不是上述4步這么容易,還有很多地方要細扣,比如怎么轉動視角?用 OpenGL 畫一個球的過程是什么?這些細節我還是會分散到后續的文章中介紹,敬請期待。
感興趣的同學也可以自己先看源碼,https://github.com/androidZzT/VRPanoramaView ,記得給點個星星~
三、完整技術棧
圖3-技術棧
圖中為項目里用到的技術,可能有遺漏,后面會再完善。
轉文聲明
如有文章轉載需求,請注明本文作者以及鏈接,感謝各位理解支持
總結
以上是生活随笔為你收集整理的让一个图片填满一个控件_如何在Android中实现一个全景图控件(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族20 Pro正面图首曝:边框极窄 近
- 下一篇: ROG B760 小吹雪主板 DDR5