android - GLSurfaceView 在 Honeycomb 上有时会变黑,在 ICS 上有效

标签 android glsurfaceview

[编辑:已修复!问题似乎是在布局 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/

相关文章:

java - 在 Java 中将 UTF32 转换为 UTF16

android - 当用户未触摸屏幕时如何隐藏布局?

java - 如何在两个 CanvasView 对象上使用 onClickListener?

android - 如何在同一个布局中使用多个 GLSurfaceView 组件?

android - Nexus 5 上的 GLSurfaceView 帧率问题

java - Android_Home 路径在 Cordova 中给出错误

android - 使用 getLayoutParams() 时出现空指针异常

android - 如何在 Android 上正确使用 setZOrderMediaOverlay?

android - glsurfaceview 忽略 admob 高度

android - 在不同的 GLSurfaceView 之间共享 GLES20 上下文和纹理?