java - Android openGL黑方 block b​​ug

标签 java android opengl-es android-softkeyboard

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

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

  • 我试图在 onSurfaceChangedonSizeChanged 中放置一个 invalidate() 和一个 forceLayout 函数调用,但它不起作用.

  • 我指出该错误仅出现在“Epson moverio”眼镜上,我不明白为什么。

  • 构建我自己的继承自 GLSurfaceView 的类并将其放入 Activity 的布局中以显示 3D 是否是一种好方法,或者是否有其他更好的方法来实现这种效果的特征?

这是我的 GLSurfaceView 类实现的一些代码 fragment

@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{
}

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

最佳答案

好吧,终于找到bug的原因了。您必须设置显示 openGL 内容的 View 的颜色,黑色方 block 会神奇地消失。

关于java - Android openGL黑方 block b​​ug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862558/

相关文章:

android - 存储和检索音频文件

c++ - GLSL ES顶点着色器错误

ios - iPhone OpenGL ES 2.0 - 像素完美纹理

java - R.layout.menu无法解析

java - 如何在撰写邮件功能中将表面 View 与媒体记录器连接

java - 可以缓存对 javax.persistence.EntityManager 的引用吗?

JavaFx - 在主窗口旁边打开窗口

android - Android 上的 TCP 数据包编辑

java - 非SDK接口(interface)访问隐藏方法logcat警告和限制

ios - Cocos2D & ccDrawLine - 绘制流畅的线条