第二章,使用TextureView渲染Camera画面
上一章我们讲到了使用SurfaceTexture
作为Camera
数据的缓冲区,这仅仅是把帧数据缓冲到了纹理上,并没有把它绘制出来,所以这一章我们来实现这个功能。
按照惯例,还是先来个脑图,以便很好的了解这部分的结构。
Render
首先来看看Render
接口,其中定义了一系列方法:
- onFrameAvailable(): 在
SurfaceTexture.OnFrameAvailableListener
的同名回调方法中调用,通知Render摄像头的SurfaceTexture
有新的数据生成,可以准备进行处理了,这里是绘制到屏幕。 - draw():把帧数据绘制到屏幕上。
- start(texture: SurfaceTexture, width: Int, height: Int):接收一个SurfaceTexture,把它绑定到
OpenGL
环境上即可进行屏幕绘制。 - stop():停止渲染。
- release():并且释放资源。
- setFilter(filter: BaseFrameBufferTexture):设置一个渲染滤镜(待实现)
- getFrameBuffer(): Int:获取屏幕纹理的
frameBuffer
,设置了滤镜后会返回滤镜的frameBuffer
。 - getFrameBufferTexture(): Int:获取屏幕纹理的id,设置了滤镜后会返回滤镜的纹理id。
interface Render {
fun onFrameAvailable(): Render
fun draw()
fun start(texture: SurfaceTexture, width: Int, height: Int)
fun start(texture: SurfaceTexture, width: Int, height: Int, runnable: Runnable?)
fun stop()
fun release()
/**
* After render completed
*/
fun afterRender(runnable: Runnable)
fun setFilter(filter: BaseFrameBufferTexture)
fun getFrameBuffer(): Int
fun getFrameBufferTexture(): Int
}
由于Render
需要知道Camera
的纹理中是否有数据,所以需要接收Camera SurfaceTexture
的回调。在这个项目中,Render是被CameraPreviewPresenter
管理的,所以我们对上一章讲到的CameraPreviewPresenter
进行扩展。
我们可以看到,这里实现了SurfaceTexture.OnFrameAvailableListener
接口,并且在CameraWrapper.open
的时候传给了CameraWrapper``,在这个类内部又会把接口设置给SurfaceTexture
,当这个缓冲区中有数据时,就会回调这个接口中的方法来通知我们进行处理。
于此同时,我么也初始化了一个DefaultRenderImpl
对象,这个对象接收上面我们讲到的回调通知,用来把SurfaceTexture
缓冲区中的数据绘制到屏幕。
数据入口我们有了,合适开始预览呢。当TextureView
初始化完成时,我们调用startPreview(screenTexture: SurfaceTexture, width: Int, height: Int)
方法,来通知CameraWrapper
把帧数据绘制(缓冲)到Camera
的SurfaceTexture
中。并且Render
接收TextureView
的SurfaceTexture
缓冲区,包括宽高,在内