現在、私はonTouchEvent
メソッドをオーバーライドしてAndroidのマルチタッチを実装するゲームに取り組んでいます。その中で私はすべてのポインタの上に行くforループを持っています。しかし、時にはACTION_POINTER_UP
に正しく動作しないため、IllegalArgumentException
がスローされます。私はそれを捕まえてループを続けようとしましたが、時にはうまく動作せず、不安定な動作を表示します。 IllegalArgumentException
がスローされたときに、ループポインタがアクティブポインタでもなく、ポインタの総数に等しいかそれ以上でないことを確認するためにデバッグしました。参考までに私のコードがあります。 AndroidマルチタッチACTION_POINTER_UP MotionEvent.getX 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()
iが= 1とevent.getX(event.getPointerId(i))
はそれがIllegalArgumentException
をスロー呼び出されたときしかし、常に0で発生したときに発見し、ループが二時間をかけてスキップされますが発生
この状況に関する助けがあれば幸いです。