GLSurfaceView有时在Honeycomb上是黑色的,适用于ICS

时间:2012-05-18 17:35:27

标签: android glsurfaceview

[编辑:固定!问题似乎是在布局xml中覆盖了我的GLSurfaceView的不可见的VideoView。从布局中删除VideoView会恢复预期的行为。]

[编辑#2:使GLSurfaceView使用ARGB888也应该解决这个问题(不能混合我假设的不同颜色格式的表面),从那时起就是通过视频显示GL。]

我成功使用了GLSurfaceView,但在Android 3.2平板电脑上看到了一个奇怪的问题。 GLSurfaceView活动使用AndroidManifest强制横向方向。如果我从纵向方向的现有活动开始,屏幕旋转,GLSurfaceView按预期工作。如果我从横向活动开始,GLSurfaceView是黑色的。这不仅仅是一个纹理问题,glClearColor和通过glDrawArrays填充实心三角形都不可见。

  • 如果我旋转屏幕(在删除manifest指令后手动,或通过带或不带manifest指令的setRequestedOrientation),它就会开始工作。

  • 如果我按下后退按钮,我会在活动退出时看到预期的渲染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

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

1 个答案:

答案 0 :(得分:1)

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