Как отозвать `requestDisallowInterceptTouchEvent (false)`, не поднимая палец (Action.UP или Cancel)? - PullRequest
0 голосов
/ 19 сентября 2018

У меня 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 по-прежнему не срабатывает.Есть идеи, чтобы решить это?

1 Ответ

0 голосов
/ 30 сентября 2018

Таким образом, в основном решение состоит в том, чтобы переопределить 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)
    }
...