[编辑:已修复!问题似乎是在布局 xml 中有一个不可见的 VideoView 覆盖了我的 GLSurfaceView。从布局中删除 VideoView 会恢复预期的行为。]
[编辑 #2:让 GLSurfaceView 使用 ARGB888 应该也可以解决这个问题(我认为不能混合具有不同颜色格式的表面),此后这样做是为了在视频上显示 GL。]
我成功地使用了 GLSurfaceView,但在 Android 3.2 平板电脑上发现了一个奇怪的问题。 GLSurfaceView Activity 使用 AndroidManifest 强制横向。如果我从纵向的现有 Activity 开始它,屏幕会旋转并且 GLSurfaceView 会按预期工作。如果我从横向 Activity 开始,GLSurfaceView 是黑色的。这不仅仅是一个纹理问题,无论是 glClearColor 还是通过 glDrawArrays 填充的实心三角形都不可见。
如果我旋转屏幕(在删除 list 指令后手动旋转,或者通过 setRequestedOrientation 有或没有 list 指令)它开始工作。
如果我按下后退按钮,我会在 Activity 退出时看到预期呈现的 GLSurfaceView 片刻。
如果我开始一个新 Activity (一个 SettingsActivity),我会看到预期渲染的 GLSurfaceView 在开始新 Activity 和通过按下后退按钮返回到 GLSurfaceView Activity 时闪烁片刻(然后屏幕变黑)再次),但仅当设备处于横向时。如果我将设备置于纵向模式,然后启动我的设置 Activity ,我看不到 GL 闪烁,但在按下返回之前旋转到纵向,当 GLSurfaceView Activity 恢复时,我确实看到了闪烁。
我在模拟器和 Android 4.0.4 手机上都没有看到这种行为。
我在 onCreate 中创建 GLSurfaceView 并将其添加到布局 xml 中的 FrameLayout。
我正在从相应的 Activity 方法中调用 GLSurfaceView 暂停和恢复方法。这是我的 onSurfaceCreated 和 onSurfaceChanged 处理程序:
public final static void onSurfaceCreated(GL10 pGL) {
pGL.glClearColor(0.5f, 0.5f, 0.5f, 1f);
pGL.glEnable(GL10.GL_TEXTURE_2D);
pGL.glEnable(GL10.GL_BLEND);
pGL.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
pGL.glShadeModel(GL10.GL_FLAT);
pGL.glDisable(GL10.GL_DEPTH_TEST);
pGL.glDisable(GL10.GL_DITHER);
pGL.glDisable(GL10.GL_LIGHTING);
}
public final static void onSurfaceChanged(GL10 pGL, int pWidth, int pHeight) {
pGL.glViewport(0, 0, pWidth, pHeight);
pGL.glMatrixMode(GL10.GL_PROJECTION);
pGL.glLoadIdentity();
pGL.glOrthof(0f, pWidth, 0f, pHeight, -1f, 1f);
pGL.glMatrixMode(GL10.GL_MODELVIEW);
}
这是我设置 GLSurfaceView 的方式:
mGLSurfaceView = new GLSurfaceView(pContext);
mGLSurfaceView.setEGLConfigChooser(false); // no depth buffer
mGLSurfaceView.setRenderer(this);
mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
我添加了日志记录来验证 onSurfaceCreated 和 onSurfaceChanged(具有预期的大小),以及正在调用 onDrawFrame。
我发现有人在 TabHost 中使用 GLSurfaceView,但没有很好的解决方案:https://groups.google.com/forum/?fromgroups#!topic/android-developers/fXPfgw6AoeY
我一直在尝试请求焦点、无效、请求布局等的组合,但都没有成功。我希望这里有人可以帮助我看到光明!
最佳答案
回答我自己的问题:已修复!问题似乎是在布局 xml 中有一个不可见的 VideoView 覆盖了我的 GLSurfaceView。从布局中删除 VideoView 会恢复预期的行为。
关于android - GLSurfaceView 在 Honeycomb 上有时会变黑,在 ICS 上有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657238/