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:
onTouchEvent
de la vue
- Le
OnGestureListener's onDown
- Le
OnGestureListener's onShowPress
- 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);
}
}
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
@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
@javito +1 sur votre question pour figurer celui-ci. Cela m'a aussi aidé à voler des événements de ma vue de défilement –