내 데스크탑 게임을 안드로이드로 포팅 할 수 있도록 포인터의 목록과 화면상의 위치 (픽셀 단위)를 얻으려고합니다. 이렇게하려면이 onTouch 핸들러를 작성했습니다.Android 멀티 터치 - TouchMove 이벤트의 IllegalArgumentException
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
을 얻고있다. 이것은 한 번에 화면에 3 개 이상의 손가락을 가볍게 두드리는 경우에만 발생하지만 여전히 문제가됩니다. 예외는 다음과 같습니다.
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()
까지 for 루프하고 있어요 때문에 내가 그렇게 코드의 외출 인덱스의 기회가없는 오류를 받고 있어요 이유를 모르겠어요.
포인터 ID를 추적하고 싶지 않습니다. 포인터의 원시 목록을 원하고 이러한 이벤트가 내 엔진 목록에서 다음 프레임을 구성합니다.
누구든지 문제가있는 부분을 지적 할 수 있습니까?
바로! 이것을 지적 해 주셔서 감사합니다. –