¿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.
- Un diseño relativo simple, alinear con el derecho de los padres no funciona
- Cómo desarrollar aplicaciones de reconocimiento de voz como tom de conversación
- Android: Centrar elementos en un ListVIew
- ¿Tenemos alguna herramienta para convertir el diseño xml de Android a archivos .java?
- Android-L CardView Visual Touch Comentarios
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
- ¿Por qué se considera 0dp una mejora de rendimiento?
- Android diseño approch clarificación
- El elemento de la vista de cuadrícula no se ilumina cuando se pulsa
- RelativeLayout no maneja "toLeftOf" y / o toRightOf correctamente
- ¿Qué causa "RuntimeException: línea de archivo XML binario # 20: Debe proporcionar un atributo layout_height." (Se sospecha que ActionBarScherlock)?
- Evento de inflado de acabado de ViewGroup
- ¿Por qué mi diseño se ensucia después de borrar el flag FLAG_TRANSLUCENT_STATUS?
- Doble control deslizante android
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.