从我的机器人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");
}
}
答案 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所需的公式。如果iMaxYSizeDpi
和iMaxXSizeDpi
是整数,请注意整数除法。