2013-05-21 91 views
2

關於MotionEvent.getX/.getY如何「不可靠」(或其他術語)以及我們應該如何使用這些調用的Raw版本來獲取座標,有許多討論。Android getX/getY交錯相對/絕對座標

在我的Nexus 7上,我發現.getX/.getY可靠地返回交織的絕對座標和相對座標。換句話說,當你調用.getX和.getY時,給定的ACTION_MOVE事件返回絕對座標。接下來的ACTION_MOVE事件將返回其.getX和.getY調用的相對座標。

這不能是意外的行爲。這也讓我相信,必須有一種方法來辨別給定的ACTION_MOVE是否會返回絕對座標或相對座標。

有誰知道如何檢查一個給定的MotionEvent對象,看它是否在它的.getX和.getY調用上返回絕對座標和相對座標?

編輯:根據您的要求,這裏的代碼。沒什麼特別的,只是搶座標和移動View對象:

public boolean onTouch(View v,MotionEvent event) { 

    boolean bExitValue = true; 
    float fX; 
    float fY; 
    int  iAction; 

    iAction = event.getActionMasked(); 

    if (MotionEvent.ACTION_MOVE == iAction) { 
     fX = event.getX(); 
     fY = event.getY(); 
     v.setX(fX); 
     v.setY(fY); 
     Log.d("",("X: " + fX + ", Y: " + fY)); 
    } 

    else if (MotionEvent.ACTION_DOWN != iAction) { 
     bExitValue = false; 
    } 

    return(bExitValue); 

} 

的Log.d電話和獨立浮動是沒有必要的,使代碼的工作,但他們可以讓你看到值的交織在LogCat窗口中。

+0

你可以請你的代碼檢查你的行爲嗎? – thiagolr

+0

上面添加的代碼,謝謝。如果你運行這個程序並且非常緩慢地移動你的手指,你可以一次獲得一個座標對 - 它們將在諸如「X:59.509125,Y:75.56683」和「X:356.14337,Y:489.77722」之類的值之間交替。大不相同的座標對,但奇數組和偶數組將彼此保持一致。這幾乎就像有兩個手指放下(儘管這不是一個MotionEvent會報告多點觸控的方式)。 – AndroidNewbie

+0

如果將[getHistoricalX/Y](https://developer.android.com/reference/android/view/MotionEvent.html#getHistoricalX%28int,%20int%29)添加到輸出中,會發生什麼情況?只有當歷史數據存在時,纔可能返回相對座標? –

回答

0

我已經發現,在銀河系4的getY和getRawY都錯了。但他們以正交的方式改變。所以你可以通過下面的代碼得到正確的值:

rawY = event.getRawY() - spaceOverLayout; 
normalY = event.getY(); 
y = 0F; 

float prozentPosition = ((rawY + normalY)/2)/height; 
y = (normalY * (1 - prozentPosition)) + (rawY * prozentPosition); 

希望它會有所幫助。