从GLSurfaceView转换为TextureView(通过GLTextureView)

当Android 4.0(冰淇淋三明治)发布后,新的观点被引入到SDK中。 这个视图是TextureView。 在文档中,它说,TextureView可以用来显示OpenGL场景的内容。

当你查看如何做到这一点,你会发现这个链接到一个例子。

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/U5RXFGpAHPE

不过,我只想用TextureViewreplaceGLSurfaceView,并保持其余的代码相同,只是接收TextureView的优点。

Related of "从GLSurfaceView转换为TextureView(通过GLTextureView)"

回答:

1)从GLSurfaceView的源代码开始,命名文件GLTextureView.java

2)将标题更改为: GLTextureView扩展TextureView实现SurfaceTextureListener

3)将构造函数重命名为GLTextureView。 从init()方法中删除代码。

4)组织import。 总是select非GLSurfaceView选项。

5)findSurfaceHolder的每个实例并将其更改为SurfaceTexture

6)为SurfaceTextureListener添加未实现的方法,每个方法应该如下:

  • onSurfaceTextureAvailable – surfaceCreated(surface)
  • onSurfaceTextureDestroyed – surfaceDestroyed(表面),(返回true)
  • onSurfaceTextureSizeChanged – surfaceChanged(表面,0,宽度,高度)
  • onSurfaceTextureUpdated – requestRender()

7)在调用getHolder()的地方应该有一行,把它改为getSurfaceTexture()

8)在init()方法中,把下面一行setSurfaceTextureListener(this)

然后添加一个OnLayoutChangeListener并让它调用surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top)

有了这个,你应该能够用GLTextureView代替你的GLSurfaceView代码,并获得GLTextureView的好处。 另外请确保您的应用程序支持硬件加速,并确保您的渲染器扩展了GLTextureView .Renderer。

辉煌!

对古德莱尔先生的辉煌答案的一个小的补充:

GLSurfaceView的4.1.1版本似乎已经被修改,以避免渲染零宽度/高度的表面,我想。 并且在onSurfaceTextureAvailable之后,立即没有任何onSurfaceTextureChanged通知。

如果你从4.1.1源头开始,onSurfaceTextureAvailable需要阅读如下:

 public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { this.surfaceCreated(surface); this.surfaceChanged(surface, 0,width,height); } 

除此之外,我在五分钟左右就起来跑步了! 谢谢。

感谢Goodale先生和Davies先生的答案!

我有一些额外的转换GLSurfaceView到GLTextureView。 首先是关于渲染模式。 如上所述,只需删除onSurfaceTextureUpdated中的requestRender()调用即可。

第二个是关于
mGLESVersion = SystemProperties.getInt(“ro.opengles.version”,ConfigurationInfo.GL_ES_VERSION_UNDEFINED); 只要使用链接 ,但你需要Context来做context.getClassLoader(); 您可以从init()调用getInt的reflection版本,并将结果保存在静态字段中sGLESVersion = getInt(getContext(),“ro.opengles.version”,ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

最后一个最简单的变化是关于EGLLogWrapper.getErrorString(error); 只需从EGLLogWrapper源文件复制getErrorString即可。

在GitHub Gist上查看我的转换GLSurfaceView到GLTextureView的最终版本

如果你想复制/粘贴一个现成的课程,我在这里写了一个:

GLTextureView

你可以像使用GLSurfaceView一样调用setRenderer(GLSurfaceView.Renderer)。