我開發了一個處理視圖中多點觸控的Android應用程序。我基本上跟蹤可能發生的像ACTION_UP,ACTION_MOVE幾個MotionEvents,......在視圖類我重寫onTouch方法是這樣的:Android多點觸控:ACTION_UP並不總是被調用?
public boolean onTouch(View view, MotionEvent event)
{
int action = event.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_DOWN) {
float x = event.getX();
handleTouchStart(view, x);
} else if (action == MotionEvent.ACTION_UP) {
float x = event.getX();
handleTouchEnded(view, x);
} else if (action == MotionEvent.ACTION_POINTER_DOWN) {
int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
float x = event.getX(pointer);
handleTouchStart(view, x);
} else if (action == MotionEvent.ACTION_POINTER_UP) {
int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
float x = event.getX(pointer);
handleTouchEnded(view, x);
} else if (action == MotionEvent.ACTION_MOVE) {
int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
float x = event.getX(pointer);
handleTouchMoved(view, x);
}
return true;
}
在我的手機(三星Galaxy S),這個完美的作品。對於每個handleTouchStart(),都會調用相應的handleTouchEnded()。這對我的應用程序至關重要。它是一個2D橫向滾輪,在屏幕左下方有一個轉向區域。如果 - 出於某種原因 - 當用戶從觸摸屏上擡起手指時不調用handleTouchEnded()方法,玩家的角色將繼續運行。
我從其他設備(例如HTC Desire)上收到玩家的報告,即使他們將手指從屏幕上的轉向區域擡起,在極少數情況下,角色確實仍然繼續沿着一個方向行進。我的結論是,只有在未調用handleTouchEnded()時纔會發生這種情況,這意味着不會生成ACTION_UP(或ACTION_POINTER_UP)事件。
是否有設備特定的多點觸控支持?是否不能保證對於每個ACTION_DOWN(或ACTION_POINTER_DOWN)MotionEvent,都會調用適當的ACTION_UP(或ACTION_POINTER_UP)MotionEvent?或者我錯過了什麼?我的onTouch實現是否正確?
我的更廣泛的問題是:是否有更好的方法來處理「行動」 - 遊戲的多點觸摸屏輸入?我基本上模仿遊戲手柄轉向十字的左右控制。我發現Android的UI按鈕不能提供足夠的靈活性,因爲他們無法跟蹤onPress和onRelease事件......或者他們呢?
您知道偶然發生這種情況的頻率嗎? – 2013-09-18 00:57:48