2015-10-26 67 views
-3

從我的android 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

雖然這是正確的,

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是整數,請留意整數除法。

+0

完美!謝謝@尼科。 是的,我已經意識到除零問題,但我認爲,因爲座標來自觸摸事件,它給出了位置的中位數並且寬度> 0,所以這不是問題。但是,我已經改變了我的代碼,因爲您建議最佳實踐。 也感謝您對整數除法的警告 - 通過簡單地實現這個代碼到我的沒有任何類型轉換它總是檢查event.getY()<(iMaxYSizeDpi)!我可能花了一段時間才弄清楚那裏出了什麼問題。 –