我目前遇到了一个问题。
我在使用 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)。
似乎只有当屏幕上弹出软键盘时才会出现此错误。
我试图在
onSurfaceChanged
和onSizeChanged
中放置一个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 bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862558/