studio detector android android-layout android-gesture

detector - gesture android studio



¿Cómo implementar un gesto de "Arrastrar dos dedos" en Android? (3)

Tocar y arrastrar es una serie de eventos. Primero tienes un down, luego tienes 1 o más movimientos, luego tienes un up. Detecta un punto de inicio en el down, luego se produce el arrastre en los movimientos. El arrastre se detiene en un alto.

Para hacer un arrastre de 2 dedos, solo preste atención a drags si MotionEvent.getPointerCount () == 2.

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

Quiero que el usuario ciego arrastre dos dedos horizontalmente (en cualquier lugar de la pantalla) y obtenga una salida de audio del texto que escribió en EditText. También de acuerdo con la distancia que recorren los dos dedos mientras arrastramos, sacamos cada palabra por separado. (Ejemplo a continuación)

Ejemplo: Si el usuario escribe "Hoy es un buen día" y arrastra su dedo (valor x) por (digamos) 10 unidades hacia la izquierda, sacamos "buen día" pero si lo arrastra digamos 20 unidades hacia la izquierda sacamos "una buena día " , por 30 unidades a la izquierda " es un buen día ", etc.

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

TouchEvent(MotionEvent event)

También este tutorial sobre la detección de toques múltiples parece prometedor, pero necesito que funcione para tocar y arrastrar, y no estoy seguro de que pueda implementarse así.

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

Gracias de antemano, Adit


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

Primero inicialicé mis variables en la clase "Actividad"

int GLOBAL_TOUCH_POSITION_X = 0; int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;

A continuación, dentro de 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 con 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; } }

¡Ahí tienes! El gesto "Arrastrar con dos dedos" finalmente se implementó. ¡Parece que también puedo publicar una pequeña publicación en el blog! :)


No sé cuán relevante agregar una respuesta ahora sería a una pregunta tan antigua, pero he estado desarrollando una biblioteca para admitir los gestos básicos de 1 y 2 dedos en Android con una funcionalidad muy simple.

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 y está disponible para ser descargado como .jar