Как отозвать `requestDisallowInterceptTouchEvent(false)`, не поднимая палец (Action.UP или Cancel)?

У меня есть WebView(s) внутри RecyclerView. Чтобы получить плавную прокрутку, когда пользователь прокручивает, RecyclerView будет отвечать за прокрутку (WebView не должен прокручиваться), я вызвал getParent().requestDisallowInterceptTouchEvent(false); внутри webview#onTouchEvent(event), когда есть только одна точка касания и перемещается по вертикали (прокрутка вверх и вниз).

private void handleSingleFingerTouch(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x1 = ev.getX();
                y1 = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                x2 = ev.getX();
                y2 = ev.getY();
                // -ve param for canScrollHorizontally is to check scroll left. +ve otherwise
                if (Math.abs(x1 - x2) >= Math.abs(y1 - y2)
                        && canScrollHorizontally((int) (x1 - x2))) {
                    // scrolling horizontally. Retain the touch inside the webView.
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    // scrolling vertically. Share the touch event with the parent.
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                x1 = x2;
                y1 = y2;
        }
    }

@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean multiTouch = ev.getPointerCount() > 1;
    if (multiTouch) {
        getParent().requestDisallowInterceptTouchEvent(true);
    } else {
        handleSingleFingerTouch(ev);
    }
    return super.onTouchEvent(ev);
}

Он работает, как и ожидалось, только с одной ошибкой, я обнаружил, что при прокрутке RecyclerView (и веб-просмотра) и касании внутри WebView, затем RecyclerView перестает прокручиваться, как ожидалось, тогда, если я не подниму палец, но держу палец на экране и попробуйте увеличить, веб-просмотр не будет увеличиваться, и на самом деле он вообще не получит событие касания. Мне приходится поднять пальцы и коснуться еще раз, чтобы увеличить. Я знаю, что это потому, что getParent().requestDisallowInterceptTouchEvent(false); не будет отменено, пока пользовательский интерфейс не получит событие CANCEL или UP. Я попытался реализовать интерфейс, который вызывает getParent().requestDisallowInterceptTouchEvent(true);, когда происходит мультитач. Хотя он вызывался, но, похоже, он не работает. Зум по-прежнему не происходит, и onTouchEvent внутри WebView по-прежнему не срабатывает. Любая идея решить эту проблему?


comment
Вы включили масштабирование в веб-просмотре? webView.getSettings().setBuiltInZoomControls(true);   -  person Saikrishna Rajaraman    schedule 29.09.2018
comment
Конечно, я сделал. В основном он может масштабироваться, но просто не масштабируется в сценарии прокрутки-touchstop_don't finger.   -  person litaoshen    schedule 30.09.2018


Ответы (1)


Таким образом, в основном решение состоит в том, чтобы переопределить onInterceptTouchEvent recyclerView

override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
        // When recyclerview is scrolling this will stop scrolling and allow touch event passed to child views.
        if (e.action == MotionEvent.ACTION_DOWN && this.scrollState == RecyclerView.SCROLL_STATE_SETTLING) {
            this.stopScroll()
        }
        return super.onInterceptTouchEvent(e)
    }
person litaoshen    schedule 30.09.2018