简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView

首先先简单了解下 Surfaceview、GlSurfaceView、TextureView本质都是View。
而SurfaceTexture只是一个类,至于这个类干什么用的,后面再介绍。


image.png

SurfaceView

SurfaceView是Android1.0得时候就有了,它继承自View ,但与View又有所不同
首先SurfaceView也是一个View,它也有自己的生命周期。因为它需要另外一个线程来执行绘制操作,所以我们可以在它生命周期的初始化阶 段开辟一个新线程,然后开始执行绘制,当生命周期的结束阶段我们插入结束绘制线程的操作。这些是由其内部一个SurfaceHolder对象完成的。
如下图:


简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView_第1张图片
image.png

GLSurfaceView

GLSurfaceView从Android 1.5(API level 3)开始加入,作为SurfaceView的补充。它可以看作是SurfaceView的一种典型使用模式。在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程(Renderer)。
它得用法也非常简单 如入 只要设置了Renderer(setRenderer)就可以了,其他得操作全都在Renderer里面执行,从而实现解耦(学习笔记一


简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView_第2张图片
image.png

实际上这里得GlSurfaceview 相当于一块画布,而Renderer是画笔,通过setRenderer把这画布、画笔关联起来。

再笔记1中可以看到 绘制图像的操作全是在渲染器中执行的:
简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView_第3张图片
image.png

可以看到与实现SurfaceViewHolder.callback 接口后需实现得两个方法 surfaceviewCreated 和surfaceviewChanged(GlSurfaceview创建得时候不会调用surfaceviewChange 而surfaceview是会调用得,这个是两者得区别之一,且senderer返回得是GL 对象 而 Surfaceview返回得是Surfaceviewholder)

SurfaceTexture

SurfaceTexture从Android 3.0(API level 11)加入。和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等)。
也就是说这个东西不是用来显示给用户看的, 它是一个Texture, 意识是纹理(额~这个词让我想起opengl中的添加纹理 Texture), 可以想象成一个View的中间件。
例:Camera 把视频采集的内容交给 SurfaceTexture, SurfaceTexture 在对内容做个美颜, 然后SurfaceTexture 再把内容交给 SurfaceView。这就是最后呈现给用户视觉上的美颜内容了。
当然实现美容效果远不止这种,Camera+GLSurfaceView + GPUImage(GPUImage 原是iOS下一个开源的基于GPU的图像处理库,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜。GPUImage for Android是它在Android下的实现) 一样也是可以实现美颜效果的。关于GPUImage具体案例

TextureView

Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预览。4.4又用了自家的TextureView,所以从中也可以猜出新增TextureView的用意
TextureView是在4.0(API level 14)引入的,与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速的窗口中使用.(这应该是前两年使用的少的原因吧,因为并不是所有手机都支持硬件加速得)。
TextureView被创建后不能直接使用,必须要在它被它添加到ViewGroup后,待SurfaceTexture准备就绪才能起作用(看TextureView的源码,TextureView是在绘制的时候创建的内部SurfaceTexture,这个就是上面说的可以对图像流数据进行二次处理的类,也就是说一个TextureView就可以实现图片的滤镜效果了,当然)。


简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView_第4张图片
image.png

通常需要给TextureView设置监听器SurfaceTextuListener:

简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView_第5张图片
image.png

至于作用,我想就这里就不再说明了,
浅析TextureView)。

你可能感兴趣的:(简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView)