Problème avec onfling et SimpleoSTuStureListener
-
12-11-2019 - |
Question
Je mets en œuvre un détecteur onfling un peu comme la question suivante:Détection du geste de la laine sur la mise en page de la grille
Cependant, je ne peux tout simplement pas le faire fonctionner.
Dans le cas où j'ai configuré mon application qui cause ce problème (peut-être l'AsyncTask?), Voici comment mon application est structurée:
(J'ai essayé d'en faire une liste bien formatée, mais elle a foiré le code en dessous pour une raison quelconque?)
- MapActivity crée une MapView.
- MapView crée un asynctask pour récupérer XML à partir d'une URL.
--onPostExecute () de l'AsyncTask analyse le XML et ajoute un OversOverlay détaillé en utilisant les données récupérées
--ontap () Fonction de l'Oposteleverlay obtient une image à partir du Web à l'aide de LoveRerimageView (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-pinner-t49439.html)
--ontap () Fonction appelle ensuite la fonction show () de la classe popuppanel indiquée ci-dessous
Comme vous pouvez le voir dans le code ci-dessous, les lignes commentées fonctionnent. Cependant, les événements Ontouch et Onfling ne sont jamais frappés lorsqu'ils sont utilisés avec la classe MyGrederedEttect.
class PopupPanel {
View popup;
boolean isVisible = false;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
public View.OnTouchListener gestureListener;
PopupPanel(Context context, int layout) {
ViewGroup parent = (ViewGroup) map.getParent();
popup = ((MapActivity) context).getLayoutInflater().inflate(layout, parent, false);
SelectFilterActivity selectFilterActivity = new SelectFilterActivity();
popup.setOnClickListener(selectFilterActivity);
// This works!
// popup.setOnTouchListener(new View.OnTouchListener() {
// public boolean onTouch(View v, MotionEvent event) {
// Toast.makeText(map.getContext(), "Touched", Toast.LENGTH_SHORT).show();
// return false;
// }
// });
// Gesture detection
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(map.getContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(map.getContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
View getView() {
return (popup);
}
void show(boolean alignTop) {
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
if (alignTop) {
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
lp.setMargins(0, 20, 0, 0);
} else {
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lp.setMargins(0, 0, 0, 60);
}
hide();
((ViewGroup) map.getParent()).addView(popup, lp);
isVisible = true;
}
void hide() {
if (isVisible) {
isVisible = false;
((ViewGroup) popup.getParent()).removeView(popup);
}
}
}
La solution
Je ne suis pas sûr à 100% si c'est la raison, mais je n'ai pas vu l'appel à View.SetontouchListener Dans votre code pour gesTurerListener. Je m'attendais à la ligne;
setOnTouchListener(gestureListener)
Après l'avoir créé.
Autres conseils
Essayez de retourner true
de ton MyGestureDetector.onDown
. L'implémentation de superclass est de retourner false
qui supprime ensuite la livraison des événements futurs jusqu'à la sortie du toucher.