Interferencia multitáctil para Android

Actualmente estoy desarrollando una simulación de hockey aéreo para Android. Para el modo multijugador estoy rastreando dos eventos táctiles en la pantalla, que funciona bien siempre y cuando los puntos de contacto no lleguen a cerrar. Tacto normal

Cuando los dos dedos se cierran, androide sólo reconoce un evento de toque, en el centro de ambos puntos.

Dos eventos que se superponen

Para hacerla peor, el androide a veces ensucia las identificaciones después de la colisión.

IDs erróneos asignados

Ya pensé en estimar los próximos puntos de contacto y la asignación de IDs manualmente, ¿alguien sabe una mejor manera, o sabe de alguien que ya ha solucionado este problema mediante programación?

NOTA: Estoy probando en un Samsung Galaxy S 3

No necesariamente una solución lógica al problema, sin embargo una posible solución a la aplicación:

Si no estoy completamente equivocado, los partidos de hockey sobre el aire no deben permitir que los oponentes interfieran en el campo de juego de cada uno. Si asumimos que un borde grueso cruza el centro de la pantalla (en modo vertical), entonces no se me permitiría hacer nada más allá de ese borde, por lo tanto no hay ningún punto en seguir mi dedo después de que alcance la línea de la frontera.

Encapsular sus eventos de rastreo de tacto en ubicaciones físicas válidas como se describe podría ayudarle a ignorar los puntos no válidos (dado que las ubicaciones físicas no se cruzan, es decir).

Es posible que también tenga que seguir la dirección del vector táctil: si el vector se está estirando desde el centro de la pantalla hacia "su final" puede ser que los oponentes intrusan el dedo o su propio dedo que vuelve. En ninguno de los dos casos deberían afectar al disco de hockey (quizás).

Puede depender del dispositivo que estás usando, pero estoy utilizando el código de abajo en un Huawei X5 y nunca lío los dedos, incluso si se tocan entre sí o me los tuerza en la pantalla.

private static PointF touchScreenStartPtArr[] = new PointF[10]; private static PointF touchScreenStopPtArr[] = new PointF[10]; private static PointF touchScreenCurrPtArr[] = new PointF[10]; OnTouchListener onTouchListenerMulti = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction() & MotionEvent.ACTION_MASK; int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; int fingerId = event.getPointerId(pointerIndex); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex); touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_CANCEL: touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex); touchScreenStopPtArr[fingerId].y = event.getX(pointerIndex); break; case MotionEvent.ACTION_MOVE: int pointerCount = event.getPointerCount(); for (int i = 0; i < pointerCount; i++) { touchScreenCurrPtArr[fingerId].x = event.getX(i); touchScreenCurrPtArr[fingerId].y = event.getY(i); } break; } return true; } }; 

Tenga en cuenta que estoy utilizando fingerId y no pointerId para identificar el dedo correcto, ya que el ID del puntero puede cambiar cuando se suelta un dedo.

Espero que funcione para ti.

Así es como lo veo.

El hardware de pantalla táctil le da una resolución por debajo de la cual dos toques son los mismos que uno. Esto es algo que no puedes cambiar.

Ahora la pregunta es, ¿qué hacer cuando se fusionan dos toques? (Esto es algo que se puede probar por programación se podría pensar, por ejemplo, si 2 touch pts -> 1 touch pt. ​​Y prev touch pt 1 es lo suficientemente cerca de prev touch pt 2 …). En su caso, movería ambos discos a lo largo del gesto del tacto fusionado hasta que se separaran, luego regresaría el control individual.

Por supuesto, veo varios problemas con esto, como que controles táctiles que puck después de la división? Tal vez una persona levantó el dedo durante la fusión.

Podrías hacer que ambos jugadores pierdan el control de su puck si se produce una fusión. Esto podría simular el choque a la muñeca como su mano se desplaza en su oponente 🙂

También me gusta @dbm idea.

Espero que esto ayude. Probablemente no 🙂

  • Multitouch para Android obteniendo punteros erróneos y / o valores XY
  • Pruebas de Android, ¿cómo simular multitouch (zoom in / out) utilizando instrumentos?
  • Juego de Multitouch de Android
  • MotionEvent.getPointerCount () siempre es 1
  • Programaticamente, descubre cuántos dedos en el dispositivo multitáctil Android soporta
  • Android Webview multitouch touchstart evento no funciona con más de 2 dedos
  • multitouch androide, el puntero de acción no funciona correctamente
  • ¿Cómo puedo probar multi-touch en Android Emulator?
  • Android Libraries para la implementación de Multi Touch fácil que incluye Twist / Rotate etc?
  • Deshabilitar o evitar el multitouch en Actividad
  • La diferencia de utilizar el método MotionEvent.getAction ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.