Android OnGestureListener Fling не обнаруживает

Я хочу обнаружить движение движения в блоке экрана. Для этого я использую следующий код.

public class MyinfoActivity extends Activity implements OnGestureListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ..........
        ..........
        gestureScanner = new GestureDetector(this);
        resBlock = (TableRow) findViewById(R.id.ResBlock);
        gestureScanner = new GestureDetector(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me){
        Log.d(null,"Touch");
        if (gestureScanner.onTouchEvent(me))
            return gestureScanner.onTouchEvent(me);
        else
            return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
                       float velocityX, float velocityY) {
        Log.d(null,"Fling");
        ............
        ............
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {}

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                        float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {}

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
}

Он обнаруживает TouchEvent, но не обнаруживает никакого движения. В чем проблема в моем коде?

Ответ 1

Я использовал следующий код и решил проблему.

public class MyinfoActivity extends Activity {
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myinfotrackerinner);
        gestureScanner = new GestureDetector(this,simpleOnGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureScanner.onTouchEvent(event);
    }

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
                       new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDown(MotionEvent event) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                                   float velocityX, float velocityY) {
            Log.d(null,"Fling");
            int dx = (int) (event2.getX() - event1.getX());
            // don't accept the fling if it too short
            // as it may conflict with a button push
            if (Math.abs(dx) > MAJOR_MOVE 
                       && Math.abs(velocityX) > Math.abs(velocityY)) {
                if (velocityX > 0) {
                    moveGraph("L");
                } else {
                    moveGraph("R");
                }
                return true;
            } else {
                return false;
            }
        }
    };
}

Ответ 2

Сначала ваш метод onTouchEvent неверен и вызовет 2 вызова onTouchEvent объектом gestureScanner. Вы должны изменить это:

    @Override
    public boolean onTouchEvent(MotionEvent me){
         Log.d(null,"Touch");
         if (gestureScanner.onTouchEvent(me))
             return true;
         else
             return super.onTouchEvent(event); // or false (it what you whant).
    }

У вас также есть эта строка дважды:

gestureScanner = new GestureDetector(this);

Затем попробуйте изменить свой метод onFling следующим образом:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
    try{
        if(Math.abs(e1.getY()-e2.getY()) > 250) 
            return false;               
        if(e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200){
            Log.d("Fling", "Move Next");
            //do something...
        }
        else if(e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200){
            Log.d("Fling", "Move Previous");
            //do something...
        }
        return false;
    }
    catch(Exception e){
        return false;
    }
}

Ответ 3

return true в вашем методе onDown

@Override
public boolean onDown(MotionEvent arg0) {
    return true;
}