Frage

Ich implementiere einen OnFling-Detektor, ähnlich wie die folgende Frage:Erkennung von Fling-Gesten im Rasterlayout

Allerdings bekomme ich es einfach nicht zum Laufen.

Für den Fall, dass eine Art und Weise, wie ich meine App eingerichtet habe, dieses Problem verursacht (vielleicht die asynchrone Aufgabe?), ist meine App wie folgt strukturiert:

(Ich habe versucht, die Liste schön zu formatieren, aber der Code darunter ist aus irgendeinem Grund durcheinander geraten?)

--MapActivity erstellt eine MapView.

--MapView erstellt eine ASyncTask, um XML von einer URL abzurufen.

--onPostExecute() der ASyncTask analysiert das XML und fügt mithilfe der abgerufenen Daten ein ItemizedOverlay hinzu

--onTap()-Funktion des ItemizedOverlay ruft mithilfe von LoaderImageView ein Bild aus dem Web ab (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html)

Die Funktion --onTap() ruft dann die Funktion show() der unten aufgeführten PopupPanel-Klasse auf

Wie Sie dem folgenden Code entnehmen können, funktionieren die auskommentierten Zeilen.Allerdings werden die Ereignisse onTouch und onFling nie getroffen, wenn sie mit der Klasse MyGestureDetector verwendet werden.

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);
        }
    }
}
War es hilfreich?

Lösung

Ich bin nicht 100% sicher, wenn dies der Grund ist, aber ich habe keinen Anruf auf SehenssignaltouchListener in Ihrem Code für GesturListener.Ich hätte die Zeile erwartet; generasacodicetagpre.

nachdem Sie es erstellt haben.

Andere Tipps

Versuchen Sie, zurückzukehren true von deiner MyGestureDetector.onDown.Die Implementierung der Superklasse soll zurückkehren false Dadurch wird dann die Übermittlung zukünftiger Ereignisse unterdrückt, bis die Berührung freigegeben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top