当Android 4.0 (Ice Cream三明治)发布时,sdk引入了一个新的视图。此视图是TextureView。在文档中,它说TextureView可用于显示OpenGL场景的内容。
当你查看如何做到这一点时,你会发现这个链接指向一个例子。
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/U5RXFGpAHPE
然而,我只想用TextureView替换GLSurfaceView,并保持其余代码不变,只获得TextureView的优点。
发布于 2012-08-22 03:08:05
答案:
1)从GLSurfaceView的源代码开始,将文件命名为GLTextureView.java
2)将标题更改为:GLTextureView extends implements
3)将构造函数重命名为GLTextureView。从init()方法中删除代码。
4)组织导入。始终选择非GLSurfaceView选项。
5)找到SurfaceHolder的每个实例并将其更改为SurfaceTexture
6)为SurfaceTextureListener添加未实现的方法,每个方法如下:
7)应该有一行对getHolder()进行调用,将其更改为getSurfaceTexture()
8)在init()方法中,放入以下行setSurfaceTextureListener(this)
然后添加一个OnLayoutChangeListener并让它调用surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top)。
这样,您就可以用GLTextureView替换您的GLSurfaceView代码,并获得GLTextureView的好处。此外,请确保您的应用程序支持硬件加速,并且渲染器扩展了GLTextureView.Renderer。
发布于 2012-08-23 09:04:02
非常出色!
除了古代尔先生精彩的回答之外,还有一个小补充:
我认为,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);
}除此之外,我在大约5分钟内就启动并运行了!谢谢。
发布于 2014-12-12 00:52:47
感谢Goodale先生和Davies先生的回答!
我有一些额外的关于转换GLSurfaceView到GLTextureView。第一个是关于渲染模式。如前所述,there只需删除onSurfaceTextureUpdated中的requestRender()调用即可。
第二个是关于
mGLESVersion = SystemProperties.getInt("ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);只使用link,做context.getClassLoader()需要上下文;可以从init()调用反射版本的getInt,将结果保存在静态字段sGLESVersion = getInt(getContext(),"ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
最后一个最简单的更改是关于EGLLogWrapper.getErrorString(错误);只需从EGLLogWrapper源代码复制getErrorString即可。
请参阅我在GitHub Gist上将GLSurfaceView转换为GLTextureView的最终版本
https://stackoverflow.com/questions/12061419
复制相似问题