2011-05-08 39 views
7

我開發了一個處理視圖中多點觸控的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事件......或者他們呢?

+0

您知道偶然發生這種情況的頻率嗎? – 2013-09-18 00:57:48

回答

15

你錯過了什麼。 ;)還有一個動作類型應該處理:ACTION_CANCELACTION_CANCEL在正在進行的手勢在某個更高級別中止時發送 - 某些更高級別的組件可能已截獲該手勢並將其接管,等等。

+1

非常感謝!不能相信我自己沒有看到。然而,看起來奇怪的是,這些手勢在不同硬件上的工作方式不同。 – 2011-05-08 21:26:02