Android: обнаружение бросков - PullRequest
       12

Android: обнаружение бросков

11 голосов
/ 16 декабря 2009

В моем приложении я пытаюсь зафиксировать событие броска в представлении (точнее, ScrollView, но пробовал также с LinearLayout).

Устанавливая точки останова, я вижу, что MotionEvents происходит правильно до точки, где onFling() должен срабатывать.

Поток событий выглядит следующим образом:

  1. Вид onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. OnGestureListener's onLongPress

Я в растерянности, пытаясь отладить что-то подобное, и поиск в Google мало что дает. Есть указатели?

Я также прилагаю соответствующий вид, который должен обрабатывать жесты:

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

1 Ответ

2 голосов
/ 16 декабря 2009

Возьмите MotionEvent из Activity, а не из вашего просмотра. Когда ваш детектор жестов основан на MotionEvent, полученном из Activity, вы получите событие onFling. Поэтому вам нужно переместить onTouchEvent () из вашего GestureScrollView в ваш класс Activity. Привет!

...