【问题标题】:horizontalscrollview inside viewpagerviewpager里面的horizo​​ntalscrollview
【发布时间】:2014-10-07 11:29:46
【问题描述】:

我有一个 2 到 4 页的浏览器。其中一页以表格形式呈现数据。为此,我使用垂直滚动和水平滚动。

由于horizo​​ntalscrollview 和viewpager 之间的冲突,有时滚动不起作用。

我想在页面向左滚动时滚动页面。当它到达边缘时,另一个滑动手势将使其更改视图寻呼机的页面,遵循http://developer.android.com/design/patterns/swipe-views.html 的指南 其中声明:“如果视图包含超出屏幕宽度的内容(例如宽电子邮件),请确保用户的初始滑动将在视图内水平滚动。一旦到达内容的末尾,应再次滑动导航到下一个视图。此外,支持使用边缘滑动在内容水平滚动时立即在视图之间导航。”

我怎样才能做到这一点?

【问题讨论】:

  • 这可能很棘手。将需要编写自定义触摸侦听器并使用 requestDisallowInterceptTouchEvent 指令。看看它是如何在 PhotoView 库中完成的(它可以使用 ViewPager 滚动)github.com/chrisbanes/PhotoView

标签: android android-viewpager horizontalscrollview


【解决方案1】:

最后我做了一个自定义寻呼机并像这样覆盖了 canScroll 方法

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v instanceof HorizontalScrollView) {
        HorizontalScrollView scroll = (HorizontalScrollView) v;

        int vScrollX = scroll.getScrollX();
        TableLayout table = (TableLayout) scroll.getChildAt(scroll
                .getChildCount() - 1);
        int diff = (table.getRight() - (scroll.getWidth()
                + scroll.getScrollX() + table.getLeft()));

        if (vScrollX == 0 && diff <= 0) {// table without scroll
            if (dx > 20 && this.getCurrentItem() > 0) {
                this.setCurrentItem(this.getCurrentItem() - 1, true);
            } else if (dx < -20
                    && this.getCurrentItem() + 1 < this.getChildCount()) {
                this.setCurrentItem(this.getCurrentItem() + 1, true);
            }
            return false; // change page
        }
        if (vScrollX == 0 && dx > 20) {// left edge, swiping right
            if (this.getCurrentItem() > 0) {
                this.setCurrentItem(this.getCurrentItem() - 1, true);
            }
            return false; // change page
        }
        if (vScrollX == 0 && dx < -20) {// left edge, swiping left
            return true;// scroll
        }
        if (diff <= 0 && dx > 20) {// right edge, swiping right
            return true;// scroll
        }
        if (diff <= 0 && dx < -20) {// right edge, swiping left
            if (this.getCurrentItem() + 1 < this.getChildCount()) {
                this.setCurrentItem(this.getCurrentItem() + 1, true);
            }
            return false;// change page
        }
    }
    return super.canScroll(v, checkV, dx, x, y);
}

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 2015-09-02
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多