【发布时间】:2016-11-29 09:32:44
【问题描述】:
目前我正在开发一款通过覆盖onTouchEvent 方法来实现Android 多点触控的游戏。在其中我有一个遍历所有指针的 for 循环。但是,有时在ACTION_POINTER_UP 上,这无法正常工作并引发IllegalArgumentException。我试图抓住它并继续我的循环,但它有时不起作用并显示出不稳定的行为。我已经调试以确保当IllegalArgumentException 被抛出时,循环指针不是活动指针,也不是大于或等于指针总数。这是我的代码供参考。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_MOVE) {
return true;
}
if (event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
return false;
}
boolean notUp = true;
int pointerCount = event.getPointerCount();
boolean p1Turned = false;
boolean p2Turned = false;
for (int i = 0; i < pointerCount; ++i) {
float x, y;
if (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP && event.getActionIndex() == i){
notUp = false;
continue;
}
try {
x = event.getX(event.getPointerId(i));
y = D.height - event.getY(event.getPointerId(i));
} catch (IllegalArgumentException e) {
e.printStackTrace();
continue;
}
//test if the pointer is touching a button
if (x >= buttons[0] && x <= buttons[6] && y <= buttons[1] && y >= buttons[7]) {
p1.turnLeft();
p1Turned = true;
} else if (x >= buttons[12] && x <= buttons[12 + 6] && y <= buttons[12 + 1] && y >= buttons[12 + 7]) {
p1.turnRight();
p1Turned = true;
} else if (x >= buttons[24] && x <= buttons[24 + 6] && y <= buttons[24 + 1] && y >= buttons[24 + 7]) {
p2.turnLeft();
p2Turned = true;
} else if (x >= buttons[36] && x <= buttons[36 + 6] && y <= buttons[36 + 1] && y >= buttons[36 + 7]) {
p2.turnRight();
p2Turned = true;
}
}
if (!p1Turned) {
p1.stopTurning();
}
if (!p2Turned) {
p2.stopTurning();
}
if (event.getActionMasked() == MotionEvent.ACTION_UP){
p1.stopTurning();
p2.stopTurning();
}
return notUp;
}
当故障发生时,它总是 ACTION_POINTER_UP 并且通过调试我发现问题发生时event.getActionIndex() 始终为 0,但是当 i = 1 和 event.getX(event.getPointerId(i)) 被调用时,它会抛出一个 IllegalArgumentException 并跳过循环第二次。发生这种情况时,活动指针的数量始终为 2,因此不会调用 for 块中的代码。
任何有关此情况的帮助将不胜感激。
【问题讨论】:
标签: java android multi-touch touch-event motionevent