Android - обнаружить жест в разных представлениях

Мне нужно обнаружить разные жесты на более чем одном просмотре. Мои представления должны иметь возможность получать события касания, двойного касания и перетаскивания. Я попробовал детектор жестов, но моя реализация показывает мне только глобальные события жестов, и я не могу связать эти события с конкретным представлением.

в моей деятельности.onCreate:

    dthandler = new DoubleTapHandler();
    mDetector = new GestureDetector(this,dthandler);
    gestureListener = new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("myLog","touch");
        mDetector.onTouchEvent(event);
        return false;
    }
};

в моей деятельности я переопределяю функцию dispatchTouch:

@Override 
      public boolean dispatchTouchEvent(MotionEvent me){ 
        this.mDetector.onTouchEvent(me);
       return super.dispatchTouchEvent(me); 
      }

вот как я пытаюсь связать touchevent со своими представлениями:

prod.setOnTouchListener(this.gestureListener);

мой DoubleTapHandler:

public class DoubleTapHandler implements OnDoubleTapListener, OnGestureListener {
        private ProductView relatedView;

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {   
            Log.d("myLog", "onDoubleTapEvent");
            Log.d("myLog",""+e.getSource());
            return false;                      
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.d("myLog", "onDoubleTap"+relatedView);
            return false;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.d("myLog", "singletap");
            return false;
        }
}

У кого-нибудь есть совет? Спасибо!


person Anthea    schedule 27.05.2011    source источник


Ответы (2)


Чтобы заставить его работать, прикрепите жесты непосредственно к каждому представлению, и тогда у вас могут быть разные реализации.

person ACM64    schedule 27.05.2011
comment
вы сделали prod.setOnTouchListener(), вы также можете сделать это для определенных представлений, чтобы они реагировали на ваши жесты. - person ACM64; 27.05.2011
comment
правильно, я сделал это (prod - это одно из моих представлений). но я не получаю жест в этом представлении. Я просто получаю события OnTouch. - person Anthea; 27.05.2011
comment
попробуйте заменить dispatchTouchEvent() на onTouchEvent(), также взгляните на stackoverflow.com/questions/937313/ - person ACM64; 27.05.2011
comment
Не могли бы вы добавить код, чтобы показать, как это сделать? - person Suragch; 15.01.2015
comment
На самом деле, этому вопросу 3 года, и большинство вещей уже рефакторинг и оптимизация, но в любом случае в исходном коде вопроса достаточно не переопределить dispatchTouchEvent, а переопределить onTouchEvent, и это должно работать как шарм. - person ACM64; 16.01.2015

Сумасшедшая мысль. Создайте глобальный прослушиватель жестов в некотором представлении, которое обертывает их все. И вручную вызовите dispatchTouchEvent для всех ваших представлений. Это сложно, но это может сработать.

Затем добавьте onTouchEventListenrer в свои представления.

И если это не сработает, то правильным способом будет: реализовать прослушиватели жестов самостоятельно (нажатия и перетаскивания не должны быть такими сложными) и работать с перехватывать сенсорные события.

person Ilya Gazman    schedule 21.01.2015