Отправка сенсорного события в одноуровневое представление - PullRequest
3 голосов
/ 14 марта 2012

Я разработал пользовательский макет, который расширяет ViewGroup. Теперь я хочу использовать это в деятельности. В моей деятельности у меня есть как этот макет, так и viewpager внутри framelayout. Мой пользовательский макет заполняет мой макет фрейма и находится выше моего viewPager.

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

Мне пока не удалось. Либо у меня есть щелчок, но окно просмотра больше не может прокручиваться, либо наоборот. Я переопределил onTouchEvent и onInterceptTouchEvent.

Что я замечаю, так это то, что я правильно получаю событие down в своей пользовательской компоновке, но как только оно перехватывается видоискателем, я никогда не поднимаюсь туда. Как я могу установить связь между родственными взглядами для сенсорных событий?

PS: я пробовал splitMotionEvent безрезультатно

Ответы [ 2 ]

3 голосов
/ 05 апреля 2012

убедитесь, что либо onTouchEvent, либо dispatchTouchEvent вашего пользовательского макета вернет true в случае ACTION_DOWN, и тогда ваш пользовательский макет получит ACTION_MOVE и ACTION_UP позже.

1 голос
/ 27 апреля 2017

У меня была та же проблема, когда я отслеживал нажатие и проводил с помощью OnTouchClickListener.

Я решил это, отправив касание родителю и самому представлению, чтобы игнорировать предстоящее событие (чтобы вызывалось касание / щелчок его родного брата). Если событие нельзя игнорировать, используйте его.

Код выглядит так:

touchTrackingView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // do not consume this event so the sibling gets the touch/click
        if (mIgnoreNextTouchEvent) {
            mIgnoreNextTouchEvent = false;
            return false;
        }
        // TODO do what you need to do with the touch

        // next touch should be ignored so that
        // the sibling gets their touch/click invoked  
        mIgnoreNextTouchEvent = true;
        ((View) v.getParent()).dispatchTouchEvent(event);
        return true;
    }
});
...