Запретить родителям получать события касания только для определенных видов? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть ScrollView и линейный макет внутри него. Внутри линейного макета у меня есть несколько просмотров. Одно из нескольких представлений (скажем, DrawView) используется для рисования, поэтому мне нужно переопределить onTouchEvent этого метода и нарисовать вещи. В настоящее время, когда я перетаскиваю или перемещаюсь по DrawView, ScrollView также обрабатывает касание, ведущее к движению всего вида. Что я хочу, так это то, что когда я касаюсь DrawView, представление прокрутки не должно двигаться. Я прошел некоторые из этих ответов здесь

Как различать события касания группы представления дочернего и родительского вида

но я не нашел ничего, что я мог бы добавить в DrawView, что помешало бы ScrollView двигаться вверх и вниз. Обратите внимание, что DrawView не распространяется ViewGroup, поэтому у меня нет доступа к requestDisallowInterceptTouchEvent

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете получить ScrollView от вашего DrawView onTouchEvent:

ScrollView scrollView = (ScrollView) getParent();

тогда вы можете позвонить requestDisallowInterceptTouchEvent на scrollView, чтобы предотвратить прокрутку при нажатии на DrawView.

scrollView.requestDisallowInterceptTouchEvent(true);
0 голосов
/ 28 июня 2018

Итак, я сделал это в моем DrawView в onTouchEvent методе

getParent().requestDisallowInterceptTouchEvent(true);, это сработало!

0 голосов
/ 28 июня 2018

Вы можете запретить прокрутку ScrollView всякий раз, когда ваш DrawView получает событие касания. Для этого вам нужно создать пользовательские вызовы ScrollView, как показано ниже: [Оригинальный фрагмент кода]

public class MyScrollView extends ScrollView {
    private boolean enableScrolling = true;
    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        if (scrollingEnabled()) {
            return super.onInterceptTouchEvent(ev);
        } else {
            return false;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (scrollingEnabled()) {
            return super.onTouchEvent(ev);
        } else {
            return false;
        }
    }

    private boolean scrollingEnabled(){
        return enableScrolling;
    }

    public void setScrolling(boolean enableScrolling) {
        this.enableScrolling = enableScrolling;
    }
}

И вы можете позвонить scrollView.setScrolling(true/false) согласно вашему требованию.

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