2009-12-15 11 views
11

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:

  1. de la vista onTouchEvent
  2. El OnGestureListener's onDown
  3. El OnGestureListener's onShowPress
  4. 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); 
    } 
} 

Respuesta

2

Tome la MotionEvent de la Actividad no desde su punto de vista. Cuando su detector Gesture se basa en MotionEvent que proviene de Activity obtendrá el evento onFling. Por lo tanto, debe mover OnTouchEvent() desde su GestureScrollView a su clase Activity. Saludos!

+2

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

+0

@javito no puedes publicar tu código correcto como respuesta, como un caso complicado que no está bien documentado – Elemental

+0

@javito +1 en tu pregunta para descifrar esto. Me ayudó a robar eventos de mi vista de desplazamiento también –

Cuestiones relacionadas