Search code examples
androidgesturetouch-eventonfling

Android OnGestureListener Fling is not detecting


I want to detect fling motion in a block of the screen. I am using the following code for that.

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

It is detecting the TouchEvent, but it is not detecting any fling motion. What is the problem in my code?


Solution

  • I used the following code and solved the issue.

    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's 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;
                }
            }
        };
    }