24

当 Android 4.0 (Ice Cream Sandwich) 发布时,在 sdk 中引入了一个新视图。这个 View 就是 TextureView。在文档中,它说 TextureView 可用于显示 OpenGL 场景的内容。

当您查找如何执行此操作时,您会发现此链接指向一个示例。

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

但是,我只想用 TextureView 替换 GLSurfaceView,并保持我的其余代码相同,并获得 TextureView 的优势。

4

4 回答 4

36

回答:

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

2)将表头改为: GLTextureView extends TextureView implements SurfaceTextureListener

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

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

5) 找到 SurfaceHolder 的每个实例并将其更改为 SurfaceTexture

6)为SurfaceTextureListener添加Unimplemented方法,每个方法应该如下:

  • 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)

有了它,您应该能够将您的 GLSurfaceView 代码替换GLTextureViewGLTextureView. 还要确保您的应用支持硬件加速并且您的渲染器扩展GLTextureView了 .Renderer。

于 2012-08-21T19:08:05.490 回答
14

杰出的!

对古代尔先生精彩回答的一个小补充:

我认为 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);
}

除此之外,我在大约五分钟内就启动并运行了!谢谢。

于 2012-08-23T01:04:01.653 回答
5

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

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

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

最后一个最简单的更改是关于 EGLLogWrapper.getErrorString(error); 只需从 EGLLogWrapper 源中复制 getErrorString 即可。

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

于 2014-12-11T16:52:47.063 回答
4

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

GLTextureView

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

于 2015-10-19T02:44:46.630 回答