2013-10-22 40 views
4

我遇到了多點觸控事件導致觸摸索引在手指仍被按下時釋放的問題。Android多點觸控事件索引

我的Java包裝代碼粘貼在下面。該函數將activePointer整數傳遞給一個C++函數,該函數將數組中的up/down狀態存儲在數組中,並使用activePointer值作爲數組索引。向下事件將數組值設置爲true,向上事件將數組值設置爲false。

行爲如下:

  • 如果按下一個手指,觸摸索引0爲真。
  • 如果按下兩根手指,則觸摸索引0和1均爲真。
  • 如果第二根手指被移除,則觸摸索引0爲真,觸摸索引1爲假(如預期的那樣)。
  • 如果取消第一根手指而第二根手指仍然接觸,則觸摸索引0和1都是錯誤的。我認爲觸摸索引0是錯誤的,觸摸索引1仍然是正確的。

這是我的Java包裝代碼:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Integer activePointer = (event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
    Float x = event.getX(activePointer); 
    Float y = event.getY(activePointer); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_POINTER_DOWN: 
     // Log.i("touchtest", "action_down " + activePointer.toString() + 
     // "(" + x + "," + y + ")"); 
     androidRenderer.touch(x, y, activePointer); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // Log.i("touchtest", "action_move " + activePointer.toString() + 
     // "(" + x + "," + y + ")"); 
     androidRenderer.move(x, y, activePointer); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_POINTER_UP: 
     // Log.i("touchtest", "action_up " + activePointer.toString() + "(" 
     // + x + "," + y + ")"); 
     androidRenderer.up(x, y, activePointer); 
     break; 
    } 
    return true; 
} 

我已經閱讀文檔here,但它也不是很清楚。

我搞砸了event.findPointerIndex函數,但無法推斷出它實際正在做的任何模式。

我無法想象這是一個罕見的問題。有經驗的人可以提供你的建議嗎?謝謝。

回答

0

我對多點觸控事件沒有太多的工作,但在switch語句中可能包括一個默認情況可能會有所幫助。

0

(event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT)只會給你指針索引。指針索引可能在整個多點觸控手勢中發生變化。

你實際需要的是一個指針ID。 MotionEvent.ACTION_POINTER_ID_SHIFT名稱有點令人困惑,因爲它返回的是指針索引而不是指針ID,因此它自API 8以來已被棄用並重命名爲MotionEvent.ACTION_POINTER_INDEX_SHIFT。指針ID唯一標識一個指針。

要獲得指針ID使用getPointerId(activePointer)

通過指針ID到androidRenderer.xxx(x, y, activePointerId);,你應該沒問題。