Я пытаюсь получить список указателей, будь они вниз, и их позиции в пикселях на экране, поэтому я могу переносить свою настольную игру на Android. Для этого я написал обработчик onTouch.Android multi touch - IllegalArgumentException в событии TouchMove
private boolean onTouch(View v, MotionEvent e)
{
final int action = e.getActionMasked();
switch (action)
{
case MotionEvent.ACTION_DOWN:
surfaceView.queueEvent(() -> postTouchEvent(FINGER_0, true, e.getX(), e.getY()));
break;
case MotionEvent.ACTION_UP:
surfaceView.queueEvent(() -> postTouchEvent(FINGER_0, false, e.getX(), e.getY()));
break;
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_POINTER_UP:
{
final int index = e.getActionIndex();
final int finger = index + 1;
if (finger < FINGER_1 || finger > FINGER_9)
break;
final boolean isDown = action == MotionEvent.ACTION_POINTER_DOWN;
surfaceView.queueEvent(() -> postTouchEvent(finger, isDown, e.getX(), e.getY()));
}
break;
case MotionEvent.ACTION_MOVE:
for (int i = 0; i < e.getPointerCount(); i++)
{
final int finger = i + 1;
if (finger < FINGER_0 || finger > FINGER_9)
break;
surfaceView.queueEvent(() ->
postTouchEvent(finger, true, e.getX(finger - 1), e.getY(finger - 1)));
}
for (int i = e.getPointerCount(); i < FINGER_9; i++)
{
final int finger = i + 1;
surfaceView.queueEvent(() -> postTouchEvent(finger, false, 0, 0));
}
break;
}
return true;
}
Проблема, однако с ACTION_MOVE
случае, я получаю в IllegalArgumentException
для доступа к указательным идентификаторов. Это происходит только тогда, когда я нажимаю три или несколько пальцев на экране одновременно, но это все еще проблема. Исключением является следующее.
FATAL EXCEPTION: GLThread 61026
Process: com.shc.silenceengine.tests.android, PID: 23077
java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2014)
at com.shc.silenceengine.backend.android.AndroidInputDevice.lambda$onTouch$14(AndroidInputDevice.java:228)
at com.shc.silenceengine.backend.android.AndroidInputDevice.access$lambda$6(AndroidInputDevice.java)
at com.shc.silenceengine.backend.android.AndroidInputDevice$$Lambda$7.run(Unknown Source)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)
Я не знаю, почему я получаю сообщение об ошибке, потому что я делаю для цикла только до e.getPointerCount()
так что нет никаких шансов индекса происходит из кода.
Я не хочу отслеживать идентификаторы указателей, мне просто нужен необработанный список указателей, и эти события составляют в моем списке движка для следующего кадра.
Кто-нибудь указывает мне, где проблема?
Ровно! Спасибо за указание на это. –