Android openGL黑色方块bug

时间:2014-07-21 10:09:40

标签: java android opengl-es android-softkeyboard

我目前遇到问题。 我使用Java使用带有Eclipse IDE的API 19在Android上工作。 我做了一个包含一些布局的活动。我在其中一个布局中添加了一个自定义类,它继承自GLSurfaceView,以便为用户提供3D渲染。 但实际上我在特定设备上遇到了问题,“Epson moverio”眼镜适用于Android 4.04。 当软键盘弹出时,它会显示GLSurfaceView以及与GLSurfaceView具有相同尺寸的黑色方块,并且此黑色方块与GLSurfaceView相邻。我不明白为什么我有这个错误,因为它在三星平板电脑等经典设备上运行良好,我有另一个版本的视图,我用画布绘制2D形状,我没有得到黑方问题,它似乎这种问题只发生在openGL渲染上下文中(我使用的是openGL 2.0 ES)。

  • 似乎只有当软键盘在屏幕上弹出时才会出现此错误。

  • 我尝试在invalidate()onSurfaceChanged中设置onSizeChanged和forceLayout函数调用,但它不起作用。

  • 我指出这个错误只发生在“Epson moverio”眼镜上,我不明白为什么。

  • 这是一个很好的方法来构建我自己的继承自GLSurfaceView的类,并将其放入Activity的布局中以显示3D,还是有另一种更好的方法来实现这种功能?

以下是我的GLSurfaceView类实现

的一些代码片段
@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    long time = SystemClock.uptimeMillis() % 10000L;
    float angleInDegrees = (360.0f / 10000.0f) * ((int) time);

    if (_trolleyContentInfoList != null && _trolleyCaracteristics != null) {
        _matrixTools.loadIndentity(MatrixType.MODEL_MATRIX);
        drawTrolleyStructure(angleInDegrees);
        drawTrolleyShelves(angleInDegrees);
        //drawTrolleyWheels(angleInDegrees);
    }
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub
    GLES20.glViewport(0, 0, width, height);
    float aspect = (float)width / height;
    float fovy = 60.0f;
    float near = 0.1f;
    float far = 10.0f;

    _width = width;
    _height = height;
    _matrixTools.loadIndentity(MatrixType.PROJECTION_MATRIX);
    _matrixTools.perspective(MatrixType.PROJECTION_MATRIX, fovy, aspect, near, far);
    this.forceLayout();
}

@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
    this.forceLayout();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.8f, 0.8f, 0.8f, 0.0f);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    _matrixTools.loadIndentity(MatrixType.VIEW_MATRIX);
    _matrixTools.lookAt(MatrixType.VIEW_MATRIX, 0.0f, 0.0f, -2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    _matrixTools.loadIndentity(MatrixType.MODEL_MATRIX);
    _cubeDrawer = new CubeDrawer();
    _cubeDrawer.initialize();
}

最后,这是我的自定义类继承自GLSurfaceView

的方式
public class Trolley3DView extends GLSurfaceView implements GLSurfaceView.Renderer, ITrolleyPreviewView{
}

编辑:好的,经过一次测试后,我看到黑色方块在活动中的TextView中输入内容后消失了。我必须明白我应该使活动无效,以便在软键盘弹出时强制它刷新吗?

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了这个bug的原因。你必须设置显示openGL内容的View的颜色,黑色方块将神奇地消失。