数学 - 找到触摸屏幕的四分之一

时间:2015-10-26 05:10:24

标签: android math coordinates

从我的机器人MotionEvent(触摸事件)我有触摸屏幕的X和Y坐标(具体来说,它是一个ACTION_UP事件,但无论如何。) 从上次调用OnSizeChanged时,我已经存储了我的视图对象的当前最大X和Y值(基本上是整个屏幕)。

我想知道用户是否触摸了视图顶部,底部,左侧或右侧的屏幕。

当然,如果我想要左上角,右上角,左下角和右下角,这将更容易;我正在使用一对嵌套的if .. then .... else语句来检查触摸X值是大于还是小于最大X的一半,然后用Y和最大Y的一半做同样的事。

但是因为我想要上/下/左/右,所以数学有点棘手。 我知道因为(0,0)在左上角,我可以检查(最大X除以触摸X)是否大于(最大Y除以触摸Y)。这给了我顶部和右侧/底部和左侧。 但我无法理解我需要区分上下左下角的情况。

我原本以为检查(最大X除以触摸X)是否大于(负最大Y除以(最大Y减去触摸Y))应该这样做,但显然不是。

有什么想法吗?

if (iMaxXSizeDpi / event.getX() > iMaxYSizeDpi / event.getY()) {
  Log.d(TAG, "Either bottom or left");
  if (iMaxXSizeDpi / event.getX() > -iMaxYSizeDpi / iMaxYSizeDpi-event.getY()) {
    Log.d(TAG, "This one");
  } else {
    Log.d(TAG, "That one");
  }
} else {
  Log.d(TAG, "Either top or right");
  if (iMaxXSizeDpi / event.getX() > -iMaxYSizeDpi / iMaxYSizeDpi-event.getY()) {
    Log.d(TAG, "This other one");
  } else {
    Log.d(TAG, "That other one");
  }
}

1 个答案:

答案 0 :(得分:0)

虽然这是正确的,

iMaxXSizeDpi / event.getX() > iMaxYSizeDpi / event.getY()

这有潜在危险。可能会出现0分部。所以,重新订购公式:

iMaxXSizeDpi * event.getY() > iMaxYSizeDpi * event.getX()

现在是另一条线。我们用f(x)来表示这一行。然后,我们知道:

f(0) = iMaxYSizeDpi
f(iMaxXSizeDpi) = 0

使用原型f(x) = a x + b解决此问题:

f(x) = -iMaxYSizeDpi / iMaxXSizeDpi * x + iMaxYSizeDpi

你的触摸事件在iff

之上
event.getY() < f(event.getX())
event.getY() < -iMaxYSizeDpi / iMaxXSizeDpi * event.getX() + iMaxYSizeDpi

这是插入if-cascade所需的公式。如果iMaxYSizeDpiiMaxXSizeDpi是整数,请注意整数除法。