¿Cómo implementar un gesto de "dos dedos drag" en Android?

Soy nuevo en el desarrollo de Android y estoy trabajando en un proyecto de investigación de accesibilidad para personas ciegas (Jelly Bean API nivel 17 del proyecto). He estado experimentando con algunos gestos y el gesto de dos dedos de arrastrar ha sido muy difícil de implementar. La siguiente imagen captura lo que realmente necesito bastante bien.

Gesto de arrastre

Quiero que el usuario ciego arrastre dos dedos horizontalmente (en cualquier parte de la pantalla) y obtendría una salida de audio del texto que escribió en el EditText. También según la distancia que los dos dedos viajan mientras arrastramos, cada palabra se emite por separado (ejemplo a continuación).

Ejemplo: Si el usuario escribe "Hoy es un buen día" y arrastra el dedo (x valor) por (digamos) 10 unidades a la izquierda, saldrá "buen día" pero si arrastra dice 20 unidades a la izquierda, Día " , por 30 unidades a la izquierda " es un buen día " etc etc

Me tropecé con lo que parece detectar el toque de dos dedos:

TouchEvent(MotionEvent event) 

También este tutorial sobre la detección de múltiples toques parece prometedor, pero lo necesito para trabajar para tocar y arrastrar que no estoy seguro de que se puede implementar de esta manera.

Cualquier sugerencia nueva para implementar esto o punteros a tutoriales que pueden ayudar sería genial!

Gracias de antemano, Adit

Así que gracias a Gabe aquí y numerosos blogs sobre esto, he encontrado una solución a mi pregunta!

Primero inicialice mis variables en la clase "Actividad"

 int GLOBAL_TOUCH_POSITION_X = 0; int GLOBAL_TOUCH_CURRENT_POSITION_X = 0; 

Siguiente, dentro de la onCreate ():

 //Two-Finger Drag Gesture detection RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView); TextLoggerLayout.setOnTouchListener( new RelativeLayout.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent m) { handleTouch(m); return true; } }); 

Ahora defina la función handleTouch (m) de la siguiente manera , emite la posición actual del "toque de dos dedos" junto con la posición inicial del toque:

 void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } 

¡Ahi tienes! El gesto de "dos dedos drag" finalmente implementado. ¡Parece, como puedo wrte un pequeño blog en él también! 🙂

No sé cómo relevante agregar una respuesta ahora sería a una pregunta tan vieja pero he estado desarrollando una biblioteca para apoyar gestos simples del dedo 1 y 2 en Android con una gota muy muy simple en funcionalidad.

La mayoría de los gestos se pueden configurar tan fácilmente como

 view.setOn2FingerGestureListener ( new On2FingerGestureListener () { @Override onSwipeup() { } onSwipedown() { } }); 

Es de código abierto, así como disponible para ser descargado como un archivo .jar

Toque y arrastre es una serie de eventos. Primero tienes un down, entonces tienes 1 o más movimientos, entonces tienes un up. Detecta un punto de partida en la parte inferior y, a continuación, se produce el arrastre en los movimientos. El arrastre se para en una subida.

Para hacer un arrastre de 2 dedos, sólo preste atención a los arrastres si MotionEvent.getPointerCount () == 2.

  • Cómo establecer el color de borde para EditText para error de validación
  • ¿Puedo configurar "android: layout_below" en tiempo de ejecución, de forma programática?
  • XML Layout - Identificador de entrada 0x11a es más grande que el recuento de entradas 0xb2
  • ImageView dentro de RelativeLayout tiene relleno superior e inferior
  • Disposición de Android: vistas cuadráticas
  • Círculo de giro de ProgressDialog
  • Gráficos basados ​​en XML versus png drawables?
  • Fragmento de NavigationDrawer con ListView y encabezado personalizado
  • Android - Personalizar el cuadro de diálogo con un diseño Xml
  • ¿Por qué NullPointerException cuando agrego programaticamente mi vista de texto?
  • ¿Cómo hacer que el diseño con View llene el espacio restante?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.