我正在为Android构建绘图应用程序,我的目标是Android版本> = 5.0(minSdkVersion 21
)。我在Android 6.0+设备上使用OpenGL + TextureView正确使用了图纸(在华为,One Plus,Nexus等上测试过),但在Android 5.1.1上,我在下面的附件中看到了问题。
以下是一些信息:
打开GL ES设置
setEGLContextClientVersion(2);
setPreserveEGLContextOnPause(true);
// Enable transparency.
setEGLConfigChooser(8, 8, 8, 8, 16, 8);
setOpaque(false);
...
mRenderer = new GTRenderer(this);
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
我有TextureView
的扩展名,用于处理连续/脏绘图。同样在GLTextureView
我有:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerCount() == 1) {
mRenderer.onTouchEvent(event);
requestRender();
return true;
} else {
int action = event.getActionMasked();
if (action == MotionEvent.ACTION_CANCEL) {
// Zoom started, so add Undo.
mRenderer.cancelOrFinishLine(event, false);
}
}
return false;
}
知道为什么会这样吗?
这就是它的外观(在Android 6 +上看起来像这样):
这就是它的外观(Android 5.0):
答案 0 :(得分:0)
好吧,我发现了为什么会这样。在我这之前:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
而不是null我实际上创建了一个这样的空缓冲区:
IntBuffer textureContent = IntBuffer.allocate(width * height * 4);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, textureContent);
现在我在我测试过的所有设备上都获得了白色画布 - 即使是在旧平板电脑上我也看到了上面的胡言乱语。我猜旧设备需要初始化的内容缓冲区。