Cómo codificar para multitouch

Así que estoy desarrollando una aplicación que debe manejar multitouch. Básicamente quiero un solo toque para girar (esto no es ningún problema). Y multitouch para desplazamiento.

Tengo el código básico en, pero estoy teniendo problemas cuando el cambio de single a multitouch, y viceversa, se producen. Básicamente el movimiento se sacudirá porque la posición mediana del multitouch (dos dedos) y la posición absoluta del dedo solo están a distancia. Así que si tengo dos dedos en la pantalla, forman una posición mediana y luego levanto un dedo, sería como un movimiento rápido desde esa posición mediana hasta la posición absoluta de un solo dedo. Este será el movimiento que no quiero.

Este es mi código:

@Override public boolean onTouchEvent( MotionEvent event ) { float xEvent[] = new float[ 2 ]; float yEvent[] = new float[ 2 ]; switch( event.getPointerCount() ) { case 1: xEvent[ 0 ] = event.getX( 0 ); yEvent[ 0 ] = event.getY( 0 ); switch( event.getAction() ) { case MotionEvent.ACTION_DOWN: camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] ); return true; case MotionEvent.ACTION_MOVE: camera.onTouchRotate( xEvent[ 0 ], yEvent[ 0 ] ); return true; default: return super.onTouchEvent( event ); } case 2: xEvent[ 0 ] = event.getX( 0 ); yEvent[ 0 ] = event.getY( 0 ); xEvent[ 1 ] = event.getX( 1 ); yEvent[ 1 ] = event.getY( 1 ); switch( event.getAction() ) { case MotionEvent.ACTION_DOWN: camera.onTouchDown( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) ); return true; case MotionEvent.ACTION_MOVE: camera.onTouchSlide( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) ); return true; case MotionEvent.ACTION_POINTER_1_UP: camera.onTouchDown( xEvent[ 1 ], yEvent[ 1 ] ); return true; case MotionEvent.ACTION_POINTER_2_UP: camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] ); return true; default: return super.onTouchEvent( event ); } default: return false; } } 

La función onTouchDown de la cámara sólo establece el primer valor del movimiento táctil. Es por eso que también lo uso en el movimiento hacia arriba para establecer un nuevo valor de inicio para el movimiento de un solo toque al venir de un multitouch.

Espero que alguien sepa cuál es mi problema y puede ayudarme más.

Comienza aquí si no lo has leído ya, se trata de una serie de cosas que se ocupan de multitouch en Android: http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

Algunas cosas sobre su código publicado:

  1. Nunca verás ACTION_DOWN con un recuento de punteros de 2. ACTION_DOWN sólo se envía para el primer puntero que baja. Todos los dedos que toquen la pantalla después de la primera enviarán ACTION_POINTER_DOWN .
  2. No asuma sólo hasta un toque de 2 dedos, fácilmente puede haber más.
  3. Es mucho más fácil trabajar con la acción enmascarada (use MotionEvent#getActionMasked() ) que para codificar cada índice de puntero individualmente.
  4. Al final, los índices sólo importan para extraer datos de un MotionEvent . Si está siguiendo el movimiento del puntero a lo largo del tiempo, utilice el ID del puntero.
  5. Los ID de puntero son sólo números. No haga suposiciones acerca de qué valores tendrán más allá de que serán números enteros de 0 y más.

Usted puede resolver esto con matemáticas simples, aunque puede haber una mejor manera ya incorporado.

Simplemente cree un objeto que contenga la posición de cada dedo cuando se active el evento .ACTION_POINTER_X_UP y un objeto booleano que contenga el tipo de modo de toque que utilizó por última vez.

 case MotionEvent.ACTION_POINTER_1_UP: camera.onTouchDown( xEvent[ 1 ], yEvent[ 1 ] ); boolean usedMultiTouch = true; int x = event.getX(1); int y = event.getY(1); return true; 

A continuación, su instrucción ACTION_MOVE (dentro del caso = 1) se disparará a medida que el usuario mueve el dedo a medida que van de multi a solo toque.

Ahora, dependiendo de lo que quiera hacer, puede ignorar el movimiento único (el booleano es su cheque) hasta que se active el evento .ACTION_UP y vuelva a configurar el booleano en falso

o

Usted llama a un método que hace algunas matemáticas basado en los valores de ubicación guardados y el dedo que todavía está en la pantalla. La matemática debe ser bastante fácil, pero no sé lo que realmente quieres hacer.

  • Resplandor cuando toque la pantalla en android?
  • La propiedad webkitForce del evento táctil: Feedback de presión de los dedos. Buscando documentación
  • El evento "touchmove" en el sistema android: Transformer Prime
  • Cómo enviar eventos táctiles (Eventos de pantalla) a otra aplicación en android
  • Detectar si el navegador tiene teclado / teclas de flecha en la página web
  • Android OpenGL ES: ¿Cómo se selecciona un objeto 2D?
  • ¿Cómo transferir eventos táctiles a la vista inferior en un RelativeLayout?
  • El evento touchend no funciona en Android
  • Android: ¿Cómo permitir sólo un toque?
  • Evento táctil: cuando se quita el dedo del elemento
  • Android: El botón personalizado OnClickListener no se invoca
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.