-
1 、 TextureView 是什么策菜?
-
2穿香、TextureView的使用模式
-
3 、TextureView的用途
TextureView是在4.0(API level 14)引入的称开,用于承載顯示‘?dāng)?shù)據(jù)流’的View, 如本地Camera采集的預(yù)覽數(shù)據(jù)流和視頻通話(huà)模塊從網(wǎng)絡(luò)包里解出實(shí)時(shí)視頻‘?dāng)?shù)據(jù)流’。
Android自帶Camera源碼中乓梨,有這么一段演變過(guò)程:4.0的時(shí)候用SurfaceView預(yù)覽鳖轰、4.2的時(shí)候換成了GLSurfaceView到4.4開(kāi)始使用TextureView預(yù)覽。從這個(gè)過(guò)程中大概也能猜出TextureView的用意了扶镀。(<a href="http://www.reibang.com/p/864ce5d5e2d8">About SurfaceView GLSurfaceView TextureView</a>)
與SurfaceView相比脆霎,它不會(huì)創(chuàng)建新的窗口來(lái)顯示內(nèi)容。它是將內(nèi)容流直接投放到View中狈惫,并且可以和其它普通View一樣進(jìn)行移動(dòng)睛蛛,旋轉(zhuǎn),縮放胧谈,動(dòng)畫(huà)等變化忆肾。但是TextureView必須在硬件加速的窗口中使用.
TextureView的使用:
如圖基于TextureView的Camera類(lèi)(這里實(shí)現(xiàn)拍照兵旋轉(zhuǎn)視圖功能)
1)創(chuàng)建TextureView的實(shí)例并set到Activity中(每一個(gè)Activity中都有一個(gè)android.R.content,它是一個(gè)FrameLayout)并設(shè)置SurfaceTextureListener監(jiān)聽(tīng)菱肖。
2)在?onSurfaceTextureAvailable回調(diào)中拿到SurfaceTexture客冈,并把它設(shè)置給camera,作為承載稳强、預(yù)覽數(shù)據(jù)流的載體
3)在?onSurfaceTextureDestroyed中關(guān)閉預(yù)覽场仲,釋放camera資源,返回true
在步驟2中退疫,我們發(fā)現(xiàn)渠缕,setPreviewTexture(surface)直接跳到了native層,到了這里褒繁,不用說(shuō)也知道這個(gè)效率杠杠的了吧亦鳞。代碼追蹤到了Native暫時(shí)不做深究,如若有興趣可繼續(xù)往下探索
TextureView的用途
這個(gè),我想不用我說(shuō)也能猜出來(lái)了燕差,既然是承載顯示流的View 那肯定就是用來(lái)做Camera和視頻播放的啦
這里上一篇利用TextureView實(shí)現(xiàn)拍照和播放視頻的案例(<a >只作參考用</a>)遭笋。
最后,我們來(lái)看看TextureView都干了些什么
在TextureView的draw方法里有這么一行代碼
可以看到徒探,當(dāng)SurfaceTexture new出來(lái)后做了一個(gè)回調(diào)瓦呼,即onSurfaceTextureAvailable
然后,我們發(fā)現(xiàn)紅框出出現(xiàn)一個(gè)方法测暗,跟蹤發(fā)現(xiàn)最終調(diào)用了Native層的方法央串,OK我們就簡(jiǎn)單了解到這里: