你好,大家好〜我希望屏幕可以显示我们触摸的像素的颜色,然后我使用GLES20.GLREAD像素如下。如LogCat上所示,无论我在何处,它总是读取0 0 0 0。我还根据屏幕的宽度和高度更改了索引,但仍然获得所有零。我知道这样做应该很容易,但是我真的不知道如何解决它。有人可以帮我吗?非常感谢!
public String getFace(float angleX, float angleY, float positionX, float positionY){
String toast = "other";
int tempX = Math.round(positionX);
int tempY = Math.round(positionY);
ByteBuffer ss = ByteBuffer.allocate(4);
ss.order(ByteOrder.nativeOrder());
GLES20.glFlush();
//Get Screen's width and height
DisplayMetrics displaymetrics = new DisplayMetrics();
((Activity) getContext()).getWindowManager()
.getDefaultDisplay()
.getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;
int X = tempX;
int Y = height-tempY;
//Here it's
GLES20.glReadPixels(X, Y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss);
byte b[] = new byte[4];
ss.get(b);
String key = "" + b[0] + " " + b[1] + " " + b[2] + " " + b[3];
Log.d("Color: ", key);
ss.rewind();
Log.d("DEBUG", "X:"+ X + " Y:" + Y);
Log.d("DEBUG", "w:"+ width + " h:" + height);
if (key = ' 1 0 0 1') {
toast = "Face Red";
} else {
toast = "other";
}
return toast;
}
现在,我知道问题在哪里!由于我有一个myrenderer.java,它是当前的openGL上下文。GlreadPixels()仅在有当前的OpenGL上下文时起作用!上面的代码位于我的myglsurfaceview.java中,该java负责辅助线程,因此这就是为什么GlreadPixels()什么都没读。
解决方案是使用glsurfaceview.queueevent()向前呈现线程的glsurfaceview.queueevent()。我们现在可以在renderer.java中编写glreadpixels(),然后读取结果。
这是一个示例,引用了在此处输入链接描述
class MyGLSurfaceView extends GLSurfaceView {
private MyRenderer mMyRenderer;
public void start() {
mMyRenderer = ...;
setRenderer(mMyRenderer);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
queueEvent(new Runnable() {
// This method will be called on the rendering
// thread:
public void run() {
mMyRenderer.handleDpadCenter();
}});
return true;
}
return super.onKeyDown(keyCode, event);
}
}