从GLSurfaceView转换为TextureView(通过GLTextureView)

当Android 4.0(冰淇淋三明治)发布时,新的视图被引入到sdk中。 此视图是TextureView。 在文档中,它表示TextureView可用于显示OpenGL场景的内容。

当您查找如何执行此操作时,您将find一个示例链接。

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

但是我想用TextureView替换GLSurfaceView,并保持我的其余代码相同,并且只是接受TextureView的优点。

回答:

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

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

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

4)组织import。 始终选择非GLSurfaceView选项。

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

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

  • onSurfaceTextureAvailable – surfaceCreated(surface)
  • onSurfaceTextureDestroyed – surfaceDestroyed(surface),(return true)
  • onSurfaceTextureSizeChanged – surfaceChanged(surface,0,width,height)
  • onSurfaceTextureUpdated – requestRender()

7)应该有一行调用getHolder(),将其更改为getSurfaceTexture()

8)在init()方法中,放入以下行setSurfaceTextureListener(this)

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

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

辉煌!

Goodale先生精彩回答的一个小小的补充:

我认为,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先生和戴维斯先生的回答!

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

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

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

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

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

GLTextureView

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