2009-12-15 6 views
11

Dans mon application, j'essaie de capturer un événement de fling sur une vue (un ScrollView pour être exact, mais essayé avec LinearLayout ainsi). En réglant les points d'arrêt, je peux voir que le MotionEvents se produit correctement jusqu'au point où le onFling() doit se déclencher.Android: détecter les gestes de fling

Le flux d'événements est la suivante:

  1. onTouchEvent
  2. de la vue
  3. Le OnGestureListener's onDown
  4. Le OnGestureListener's onShowPress
  5. Le OnGestureListener's onLongPress

Je suis à une perte sur la façon de continuer à essayer de déboguer quelque chose comme ça et la recherche Google ne tourne pas beaucoup. Des pointeurs?

Je joins également la vue pertinente qui devrait gérer les gestes:

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); 
    } 
} 

Répondre

2

Prenez le MotionEvent de l'activité non de votre vue. Lorsque votre détecteur de mouvement est basé sur MotionEvent qui provient de l'activité, vous obtiendrez l'événement onFling. Vous devez donc déplacer onTouchEvent() depuis votre GestureScrollView vers votre classe Activity. Cordialement!

+2

Merci d'avoir pris le temps de répondre. En fait c'était quelque chose de bien plus compliqué que ça. Le mécanisme de bouillonnement de l'événement Android est un peu étrange. Ce qui a résolu le problème pour moi devenais onTouchEvent() pour revenir toujours vrai comme ceci: @Override onTouchEvent public boolean (événement MotionEvent) { gd.onTouchEvent (événement); renvoyer true; } Et ajouter une méthode supplémentaire: @Override onInterceptTouchEvent public boolean (MotionEvent ev) { \t retour gd.onTouchEvent (ev); } Cordialement. – javito

+0

@javito ne pouvez-vous pas poster un code correct en guise de réponse s'il vous plaît - une sorte de cas délicat qui n'est pas bien documenté – Elemental

+0

@javito +1 sur votre question pour figurer celui-ci. Cela m'a aussi aidé à voler des événements de ma vue de défilement –

Questions connexes