互动直播

浅析TextureView

2017-07-06  本文已影响2924人  无灬痕

TextureView是在4.0(API level 14)引入的,用于承载显示‘数据流’的View, 如本地Camera采集的预览数据流和视频通话模块从网络包里解出实时视频‘数据流’。
Android自带Camera源码中,有这么一段演变过程:4.0的时候用SurfaceView预览、4.2的时候换成了GLSurfaceView到4.4开始使用TextureView预览。从这个过程中大概也能猜出TextureView的用意了。(<a href="http://www.jianshu.com/p/864ce5d5e2d8">About SurfaceView GLSurfaceView TextureView</a>)
与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。但是TextureView必须在硬件加速的窗口中使用.

TextureView的使用:


image.png

如图基于TextureView的Camera类(这里实现拍照兵旋转视图功能)
1)创建TextureView的实例并set到Activity中(每一个Activity中都有一个android.R.content,它是一个FrameLayout)并设置SurfaceTextureListener监听。
2)在​onSurfaceTextureAvailable回调中拿到SurfaceTexture,并把它设置给camera,作为承载、预览数据流的载体
3)在​onSurfaceTextureDestroyed中关闭预览,释放camera资源,返回true
在步骤2中,我们发现,setPreviewTexture(surface)直接跳到了native层,到了这里,不用说也知道这个效率杠杠的了吧。代码追踪到了Native暂时不做深究,如若有兴趣可继续往下探索


image.png

TextureView的用途
这个,我想不用我说也能猜出来了,既然是承载显示流的View 那肯定就是用来做Camera和视频播放的啦
这里上一篇利用TextureView实现拍照和播放视频的案例(<a href ="https://github.com/yzwuhen/CameraTexture.git">只作参考用</a>)。

最后,我们来看看TextureView都干了些什么
在TextureView的draw方法里有这么一行代码


image.png image.png

可以看到,当SurfaceTexture new出来后做了一个回调,即onSurfaceTextureAvailable
然后,我们发现红框出出现一个方法,跟踪发现最终调用了Native层的方法,OK我们就简单了解到这里:


image.png
上一篇下一篇

猜你喜欢

热点阅读