11 Stimmen

Android: Erkennung von Wurfgesten

In meiner App versuche ich, ein Fling-Ereignis in einer Ansicht zu erfassen (ein ScrollView um genau zu sein, aber versucht mit LinearLayout auch).

Durch das Setzen von Haltepunkten kann ich sehen, dass die MotionEvents korrekt ablaufen, bis zu dem Punkt, an dem die onFling() schießen sollte.

Der Ereignisablauf ist wie folgt:

  1. Die Aussicht ist onTouchEvent
  2. El OnGestureListener's onDown
  3. El OnGestureListener's onShowPress
  4. El OnGestureListener's onLongPress

Ich bin ratlos, wie ich weiter vorgehen soll, um so etwas zu debuggen, und die Google-Suche ergibt nicht viel. Irgendwelche Hinweise?

Ich füge auch die entsprechende Ansicht bei, die die Gesten verarbeiten soll:

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

2voto

Ramps Punkte 5122

Nehmen Sie das MotionEvent von der Aktivität und nicht von der Ansicht. Wenn Ihr Gesten-Detektor auf dem MotionEvent basiert, das von der Activity kommt, erhalten Sie das onFling-Ereignis. Sie müssen also onTouchEvent() von Ihrer GestureScrollView zu Ihrer Activity-Klasse verschieben. Mit freundlichen Grüßen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X