SurfaceView 与 TextureView

类的关系:

SurfaceView (android.view)
    GLSurfaceView (android.opengl)
        SphericalSurfaceView (com.google.android.exoplayer2.ui.spherical)
    VideoView (android.widget)

TextureView (android.view)
    JZTextureView (cn.jzvd)

  • SurfaceView是一个有自己独立Surface的View, 它的渲染可以放在单独线程而不是主线程中, 其缺点是不能做变形和动画。

  • SurfaceTexture可以用作非直接输出的内容流,这样就提供二次处理的机会。与SurfaceView直接输出相比,这样会有若干帧的延迟。同时,由于它本身管理BufferQueue,因此消耗也会稍微大一些。

  • TextureView是一个可以把内容流作为外部纹理输出在上面的View, 它本身需要是一个硬件加速层。

surfaceview

事实上TextureView本身也包含了SurfaceTexture, 它与SurfaceView+SurfaceTexture组合相比可以完成类似的功能(即把内容流上的图像转成纹理,然后输出),
区别在于TextureView是在View hierachy中做绘制,因此一般它是在主线程上做的(在Android 5.0引入渲染线程后,它是在渲染线程中做的)。
而SurfaceView+SurfaceTexture在单独的Surface上做绘制,可以是用户提供的线程,而不是系统的主线程或是渲染线程。
另外,与TextureView相比,它还有个好处是可以用Hardware overlay进行显示。

SurfaceView 以及 TextureView 均继承于 android.view.View,属于 Android 提供的控件体系的一部分。与普通 View 不同,它们都在独立的线程中绘制和渲染。所以,相比于普通的 ImageView 它们的性能更高,因此常被用在对绘制的速率要求比较高的应用场景中,用来解决普通 View 因为绘制的时间延迟而带来的掉帧的问题,比如用作相机预览、视频播放的媒介等。

相比于普通的 View,SurfaceView 有以下几点优势:

  1. SurfaceView 适用于主动刷新,普通的 View 无法进行主动刷新;
  2. SurfaceView 通过子线程来更新画面,而普通的 View 需要在主线程中更新画面;
  3. 最后就是缓冲的问题,普通的 View 不存在缓存机制,而 SurfaceView 存在缓冲机制。

textureview

GSYVideoPlayer

JiaoZiVideoPlayer

都是用的TextureView

  • TextureView只能在硬件加速的窗口中使用。

  • TextureView移动,转换,动画等。例如,你可以通过调用TextureView半透明myView.setAlpha(0.5f)

videoview

显示视频文件。 所述VideoView类可以加载来自各种源的图像(诸如资源或内容提供商),需要从视频的计算它的测量,以便它可以以任何布局管理器中使用的护理,并提供不同的显示选项,例如缩放和着色。
注:进入后台时VideoView不保留其完整的状态。 特别是,它不恢复当前播放状态,播放位置,选定的曲目,或者通过添加任何字幕轨道addSubtitleSource() 。 应用程序应该保存和恢复这些他们在自己的android.app.Activity.onSaveInstanceState和android.app.Activity.onRestoreInstanceState 。
还要注意的是,音频会话ID(从getAudioSessionId )可从其先前返回值恢复VideoView时改变。
默认情况下,VideoView请求音频焦点与AudioManager.AUDIOFOCUS_GAIN 。 使用setAudioFocusRequest(int)来改变这种行为。
默认AudioAttributes播放期间使用具有的使用AudioAttributes.USAGE_MEDIA和内容类型的AudioAttributes.CONTENT_TYPE_MOVIE ,使用setAudioAttributes(AudioAttributes)对其进行修改。

你可能感兴趣的:(SurfaceView 与 TextureView)