2

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

我一直在尝试请求焦点、无效、请求布局等的组合,但没有成功。我希望这里有人可以帮助我看到光明!

4

1 回答 1

1

回答我自己的问题:已修复!问题似乎是在布局 xml 中有一个不可见的 VideoView 覆盖了我的 GLSurfaceView。从布局中删除 VideoView 会恢复预期的行为。

于 2012-05-18T21:22:08.510 回答