Android: прокручиваемый внутри ViewPager

Я помещаю пользовательский WebView внутрь пользовательского ViewPager: https://github.com/JakeWharton/Android-DirectionalViewPager

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

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

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

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


person SupaGu    schedule 12.01.2013    source источник


Ответы (1)


Возьмите пример с того, как Android делает свой ViewPager.

/**
 * Tests scrollability within child views of v given a delta of dx.
 *
 * @param v View to test for horizontal scrollability
 * @param checkV Whether the view v passed should itself be checked for scrollability (true),
 *               or just its children (false).
 * @param dx Delta scrolled in pixels
 * @param x X coordinate of the active touch point
 * @param y Y coordinate of the active touch point
 * @return true if child views of v can be scrolled by delta of dx.
 */
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v instanceof ViewGroup) {
        final ViewGroup group = (ViewGroup) v;
        final int scrollX = v.getScrollX();
        final int scrollY = v.getScrollY();
        final int count = group.getChildCount();
        // Count backwards - let topmost views consume scroll distance first.
        for (int i = count - 1; i >= 0; i--) {
            // TODO: Add versioned support here for transformed views.
            // This will not work for transformed views in Honeycomb+
            final View child = group.getChildAt(i);
            if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
                    y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
                    canScroll(child, true, dx, x + scrollX - child.getLeft(),
                            y + scrollY - child.getTop())) {
                return true;
            }
        }
    }

    return checkV && ViewCompat.canScrollHorizontally(v, -dx);
}

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

person David Liu    schedule 08.10.2013