如何从Views touch事件中获取正确的值

时间:2012-09-22 10:30:39

标签: android opengl-es touch glsurfaceview

我在GLSurfaceView上实施触控事件时遇到问题。视图大小为1280x696,因为底部的android(平板电脑)状态栏有软键,时间等..,(屏幕分辨率为1280x800),但OnTouchListener正在接收带有坐标[646.0,739.0]的触摸事件,并且因此我的gluunproject方法无法返回正确的值 有没有办法返回尊重这些边界的事件?或者我该如何重新计算位置?

1 个答案:

答案 0 :(得分:2)

一般来说,要在这样的坐标系之间进行转换:如果从系统A转换到B并且有点

  • AOrigin(接收器视图的左上角)
  • AEnd(接收器视图的右下角(原点+大小))
  • BOrigin(GL视图的左上角)
  • BEnd(GL视图的右下角(原点+大小))

其中AOrigin和BOrigin在视图中表示相同的位置,而AEnd和BEnd也是如此 那么对于接收者视图中的点P:

X = B.Origin.x + ((P.x - AOrigin.x)/(AEnd.x - AOrigin.x)) * (BEnd.x - B.Origin.x)
Y = B.Origin.y + ((P.y - AOrigin.y)/(AEnd.y - AOrigin.y)) * (BEnd.y - B.Origin.y)

对于你的情况(由于缺乏信息,我不确定)AOrigin是(0,0),AEnd是(646,739),BOrigin是(0,0)而BEnd是(1280) ,800):

X = P.x/646 * 1280
Y = P.y/739 * 800

您也可以使用它来转换为“GL”坐标。一个常见的情况是左上角为(0,0),下角为(1280,800),“GL”坐标为(-1,1)到(1,-1):

X = -1 + (P.x/1280)*2
Y = 1 + (P.y/800)*(-2)

另请注意,只要(origin-end).x != 0(origin-end).y != 0

,您就可以在屏幕上使用任意两对代表相同位置的点