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.
Cuando los dos dedos se cierran, androide sólo reconoce un evento de toque, en el centro de ambos puntos.
- Detección de pinch en Android
- Multitouch para Android y getActionMasked ()
- ¿Hay una API incorporada para manejar la funcionalidad de pinch-zoom en Android
- Detección de toque de Android 3 dedos
- Testcase con multitouch en Android?
Para hacerla peor, el androide a veces ensucia las identificaciones después de la colisión.
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
- Android - por qué hay diferentes valores de Action_mask para diferentes dispositivos
- Multitouch para Android
- Android - Cómo manejar el toque de dos dedos
- Android: ¿Cómo permitir sólo un toque?
- detectar oscilaciones a izquierda y derecha en Android (onFling y OnGestureListener)
- Android Multitouch - Determina qué dedo levantado?
- Pinch zoom in android 2.1
- Split Motion Events en android 2.3 y posterior
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 🙂
- Descripción de los mensajes de Android GC
- Recomendaciones para producir aplicaciones portátiles entre Android y "otras plataformas"