0
votes

I am implementing Gesture detection for swipe/fling movements using a inner class SimpleOnGestureListener. However no gestures are detected.

The xml layout has a parent ScrollView so I a wondering if this is a potential cause.

In onCreate I initialise the GestureListener:

public class ViewSelectedDive extends Activity implements OnClickListener,
        OnRatingBarChangeListener {...

public GestureDetectorCompat gestureDetectorObject;

protected void onCreate(Bundle savedInstanceState) {..
// instantiate gesture detector
        gestureDetectorObject = new GestureDetectorCompat(this, new GestureListener());

Override the onTouchEvent method to ensure that the gesture listener is used when a touch events is detected.

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // tell teh activity tto use gerture listener when touch event is detected

        gestureDetectorObject.onTouchEvent(event);

        Log.d(TAG, "312 ON TOUCH EVENT");
        return super.onTouchEvent(event);
    }

// inner class to handle guerter detection

    public class GestureListener extends GestureDetector.SimpleOnGestureListener{

        private float flingMin=100;
        private float velocityMin = 100;



        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            // TODO Auto-generated method stub


            Log.d(TAG, "ON FLING INNER CLASS 951");
            // user move to next dive in db
            boolean moveToNextDive=false;
            boolean moveToPreviousDive=false;

            // caulate the change in x pos within fling ges
            float horizontalDiff = e2.getX()-e1.getX();
            float verticalDiff = e2.getY() - e1.getY();

            // calulate the abs values
            float absHDiff = Math.abs(horizontalDiff);
            float absVDiff = Math.abs(verticalDiff);
            float absVelocityX = Math.abs(velocityX);
            float absVelocityY = Math.abs(velocityY);

                    // now of hor distance > vertival distance , move back or forward
                    if(absHDiff>absVDiff && absHDiff>flingMin && absVelocityX> velocityMin){

                        // swiping forwad
                        if(horizontalDiff>0) {
                            moveToPreviousDive=true;

                            Toast.makeText(getApplicationContext(), "BACKWARD GESTURE DETECTED", Toast.LENGTH_LONG).show();
                            Log.d(TAG, "SWIPE HORIZONTAL DETECTED BACKWARD");

                        }else{
                            moveToNextDive=true;
                                Toast.makeText(getApplicationContext(), "FORWARD GESTURE DETECTED", Toast.LENGTH_LONG).show();
                                Log.d(TAG, "SWIPE HORIZONTAL FORWAD DETECTED BACKWARD");
                        }

                    }// outer ifelse if(absVDiff>flingMin && absVelocityY>velocityMin){

                    else if(absVDiff>flingMin && absVelocityY>velocityMin){

                        // vertical swipe detected

                          if(verticalDiff>0) {
                              moveToPreviousDive=true;

                              Toast.makeText(getApplicationContext(), "VERTICAL BACKWARD GESTURE DETECTED", Toast.LENGTH_LONG).show();
                              Log.d(TAG, "SWIPE VERTICAL DETECTED BACKWARD");
                          }


                          else{
                              moveToNextDive=true;

                              Log.d(TAG, "SWIPE VERTICAL FORWARD DETECTED BACKWARD");
                              Toast.makeText(getApplicationContext(), "VERTICAL FORWARD GESTURE DETECTED", Toast.LENGTH_LONG).show();
                          }
                        }

            return true;
        }

        @Override
        public boolean onDown(MotionEvent e) {

//          Returning true tells the operating system that your code
//          is interested in the remaining gesture events. 
            Log.d(TAG, "ON DOWN INNER CLASS 1010");
            return true;
        }
1

1 Answers

0
votes

Got it, the scrollview will register all touch events so you need to dispatch them to Gesture detector object by overriding activities disptachTouchEvent... hope this helps anyone in same situation..

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        // must use this to pass event on to Gesture object from scrollvoew n xml

        super.dispatchTouchEvent(ev);

        return this.gestureDetectorObject.onTouchEvent(ev);
    }