我的Android應用程序出現問題,需要觸摸跟蹤事件(跟蹤何時/何處手指滑落,移動,向上等)。我必須使用event.getX()
和event.getY()
函數來獲取當前觸摸的座標。Android MotionEvent指針索引混淆
所以從我在過去的幾個月中已經瞭解到:
MotionEvent.ACTION_DOWN
跟蹤第一觸摸下來MotionEvent.ACTION_POINTER_DOWN
軌道隨後觸地MotionEvent.ACTION_UP
跟蹤最後的潤色MotionEvent.ACTION_POINTER_UP
跟蹤觸摸動作MotionEvent.ACTION_MOVE
跟蹤任何觸摸動作
在我的應用程序中,當我的第一次觸摸升起時,遇到了一個重大問題。比方說,我有五個手指觸摸我的設備(讓我們打電話給這些觸摸0,1,2,3,4)。現在,當我擡起觸摸0時,MotionEvent.ACTION_POINTER_UP
是我得到的動作。完全可以理解;我明白了。不過,現在這兩件事情會發生:
- 從移動倒是1-4任何內容:獲取一個
IllegalArgumentException
告訴我pointerIndex超出範圍 - 提起從倒是1-4什麼:來發回的信息,不同的觸摸(
event.getX()
和event.getY()
會給我不同的手指信息)
我有點在我機智的關於如何正確跟蹤此信息結束。有關如何正確跟蹤信息或抵消觸摸指針的任何線索?
我提供了我的代碼的總體佈局,但我覺得我沒有做任何不尋常的事情(我敢肯定它接近Android示例上的示例代碼?):
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
int ptr_idx = event.getPointerId(event.getActionIndex());
try {
switch (action) {
case MotionEvent.ACTION_MOVE:
handleActionPointerMove(event);
break;
// Order of touch downs doesn't matter to us
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
handleActionPointerDown(event, ptr_idx);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
handleActionPointerUp(event, ptr_idx);
break;
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
return true;
}
}
public void handleActionPointerMove(MotionEvent event) {
for (int i = 0; i < event.getPointerCount(); i++) {
handleInformation(event.getX(i), event.getY(i));
}
}
public void handleActionPointerDown(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleActionPointerUp(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleInformation(int x, int y) {
// Figures out what x+y means to us (are we in a certain box within the app? outside in clear zones? etc
}