studio scalegesturedetector recognition example event java android exception multi-touch

java - scalegesturedetector - swipe event android



punteroIndex fuera de rango Android multitáctil (5)

Tengo una excepción de evento táctil que está causando que mi juego se cuelgue en las tabletas (o más específicamente, en panal) ... Mi juego funciona bien en mi teléfono y no he escuchado que esto le ocurra a nadie que no esté ejecutando Android 3.0 o mas alto. Aquí está la información de registro relevante ...

E/AndroidRuntime(26487): java.lang.IllegalArgumentException: pointerIndex out of range E/AndroidRuntime(26487): at android.view.MotionEvent.nativeGetAxisValue(Native Method) E/AndroidRuntime(26487): at android.view.MotionEvent.getX(MotionEvent.java:1549) E/AndroidRuntime(26487): at kieran.android.asteroids.GameUI.onTouchEvent(GameUI.java:665) E/AndroidRuntime(26487): at android.view.View.dispatchTouchEvent(View.java:4616) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)

... Y aquí está el código que lo está llamando. Me parece bien, pero tal vez haya un error en el panal que aún no se ha solucionado. El número de línea 665 del registro anterior corresponde al float x = event.getX(id); línea. Debe tener algo que ver con la forma en que estoy obteniendo la variable which tal vez? Pero funciona bien en los teléfonos / 2.3 y menos ...

int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; if(actionCode == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_UP) { int which = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; int id = event.getPointerId(which); float x = event.getX(id); float y = event.getY(id);

Cualquier ayuda / idea sería muy apreciada ya que estoy tratando de hacer que mi juego esté disponible para los usuarios de tabletas también. Gracias.


La publicación original usa la ID del puntero cuando getX y getY usan el índice del puntero.

Parece que funciona cuando utiliza la ID con un solo toque porque la identificación y el índice son ambos. Se perderá si utiliza una pulsación múltiple porque los índices pueden cambiar.

Ejemplo:

Toca 1 abajo
Toque 1 Indice de estado = 0. ID = 0

Toca 2 abajo.
Toque 1 Indice de estado = 0. ID = 0
Toque 2 Indice de estado = 1. ID = 1

Toque 1 Liberar.
Toque 2 Indice de estado = 0 . ID = 1

Pruebe el siguiente código:

final int action = e.getAction(); final int pointerIndex =(action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; float x = event.getX(pointerIndex); float y = event.getY(pointerIndex);


Mi problema era que en realidad estaba llamando a event.getX (1) cuando en realidad no había dos identificadores. Así que me aseguré de que hubiera dos ID con event.getPointerCount ()> = 2 y ahora funciona. ¡Quizás tengas la misma suerte!


Si falta algo, debe aplicar la máscara al puntero, ya que técnicamente no tiene acceso a la identificación del dedo que cree que es

int action = event.getAction() & MotionEvent.ACTION_MASK; int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; int pointerId = event.getPointerId(pointerIndex);


Simplemente cambie su getPointerId() a findPointerIndex() . Tal vez cambie geAction() a getActionMasked() .

¡Espero eso ayude!


También estoy teniendo este error pero ninguna de las soluciones antes de la fecha de mi publicación funciona. El único pseudo-arreglo temporal que funciona para mí es usar un try-catch contra IllegalArgumentException .

Según Android Issue 18990 , está relacionado con ScaleGestureDetector y hace unos días se ha corregido una solución.