En mi aplicación trato de capturar un evento fling en una vista (un ScrollView
para ser exacto, pero intenté con LinearLayout
también).Android: detección de gestos arrojadizos
Al configurar los puntos de interrupción puedo ver que el MotionEvents
se produce correctamente hasta el punto donde el onFling()
debe disparar.
El flujo del evento es el siguiente:
- de la vista
onTouchEvent
- El
OnGestureListener's onDown
- El
OnGestureListener's onShowPress
- El
OnGestureListener's onLongPress
Estoy en una pérdida sobre cómo seguir tratando de depurar algo así y la búsqueda de Google no se convierte mucho más. ¿Alguna sugerencia?
también hay que adjuntar la vista relevante que debe manejar los gestos:
import android.content.Context;
import android.content.Intent;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class GestureScrollView extends ScrollView {
private static int MAJOR_MOVE = 60;
private GestureDetector gd;
public GestureScrollView(final Context context) {
super(context);
gd = new GestureDetector(context,
new GestureDetector.OnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
if (Math.abs(dx) > MAJOR_MOVE
&& Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX < 0) {
Intent intent = new Intent(context, Main.class);
context.startActivity(intent);
}
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gd.onTouchEvent(event);
}
}
Gracias por tomarse el tiempo para responder. En realidad, fue algo mucho más complicado que eso. El mecanismo de burbujeo de eventos de Android es un poco raro. Lo resuelto por mí estaba recibiendo onTouchEvent() para volver siempre cierto modo: @ Override onTouchEvent pública booleano (evento MotionEvent) { gd.onTouchEvent (evento); return true; } Y añadir un método adicional: @ Override onInterceptTouchEvent public boolean (MotionEvent ev) { \t retorno gd.onTouchEvent (EV); } Saludos. – javito
@javito no puedes publicar tu código correcto como respuesta, como un caso complicado que no está bien documentado – Elemental
@javito +1 en tu pregunta para descifrar esto. Me ayudó a robar eventos de mi vista de desplazamiento también –