[编辑:修复!问题似乎是在布局 xml 中有一个不可见的 VideoView 覆盖了我的 GLSurfaceView。从布局中删除 VideoView 会恢复预期的行为。]
[编辑#2:让 GLSurfaceView 使用 ARGB888 也应该解决这个问题(我认为不能混合具有不同颜色格式的表面),此后已经这样做了以在视频上显示 GL。]
我成功地使用了 GLSurfaceView,但在 Android 3.2 平板电脑上发现了一个奇怪的问题。GLSurfaceView 活动使用 AndroidManifest 强制横向。如果我从纵向的现有活动启动它,屏幕会旋转并且 GLSurfaceView 按预期工作。如果我从横向的活动开始,GLSurfaceView 是黑色的。这不仅仅是纹理问题,glClearColor 和通过 glDrawArrays 填充实心三角形都不可见。
如果我旋转屏幕(在删除 manifest 指令后手动,或者通过 setRequestedOrientation 有或没有 manifest 指令)它开始工作。
如果我按下后退按钮,我会在活动退出时看到预期的渲染 GLSurfaceView 片刻。
如果我开始一个新活动(一个 SettingsActivity),我会在开始新活动时看到预期呈现的 GLSurfaceView 闪烁片刻,并在按下后退按钮返回 GLSurfaceView 活动时(然后屏幕再次变黑),但前提是设备处于横向。如果我将设备置于纵向模式,然后启动我的设置活动,我看不到 GL 闪烁,但在按下回之前旋转到纵向,当 GLSurfaceView 活动恢复时,我确实看到闪烁。
我在模拟器和 Android 4.0.4 手机上都没有看到这种行为。
我在 onCreate 中创建 GLSurfaceView 并将其添加到我的布局 xml 中的 FrameLayout 中。
我正在从相应的活动方法中调用 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
我一直在尝试请求焦点、无效、请求布局等的组合,但没有成功。我希望这里有人可以帮助我看到光明!