Жесты перелистывания / смахивания не обнаружены

Я реализую обнаружение жестов для движений смахивания / бросания, используя внутренний класс SimpleOnGestureListener. Однако жестов не обнаружено.

Макет xml имеет родителя ScrollView, поэтому мне интересно, является ли это потенциальной причиной.

В onCreate я инициализирую 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());

Переопределите метод onTouchEvent, чтобы гарантировать использование прослушивателя жестов при обнаружении событий касания.

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

// внутренний класс для обработки обнаружения guerter

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

person dancingbush    schedule 07.10.2014    source источник


Ответы (1)


Понятно, scrollview будет регистрировать все события касания, поэтому вам нужно отправить их объекту детектора жестов, переопределив действия disptachTouchEvent ... надеюсь, это поможет любому в той же ситуации ..

@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);
    }
person dancingbush    schedule 08.10.2014