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);
        }
    }
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top