我的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
}