[编辑:固定!问题似乎是在布局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
我一直在尝试请求焦点,无效,请求布局等的组合,但没有成功。我希望有人能帮助我看到光明!
答案 0 :(得分:1)
回答我自己的问题:固定!问题似乎是在布局xml中覆盖了我的GLSurfaceView的不可见的VideoView。从布局中删除VideoView会恢复预期的行为。