【问题标题】:How to lock ViewPager to allow only a single page swipe at once如何锁定 ViewPager 以允许一次只滑动一个页面
【发布时间】:2015-04-01 09:58:04
【问题描述】:

默认情况下,当您在 ViewPager 上滑动时,您可以滑动尽可能多的页面,直到您的手指到达屏幕末端。那么,是否可以强制 ViewPager 无论用户滑动多少都只允许更改一页?

这就是我在寻呼机上滑动直到您的手指到达屏幕末端的意思:

这就是我将 ViewPager 锁定为一次只允许单页滑动的意思:

谢谢。

【问题讨论】:

  • 我认为我没有正确理解您的问题,因为单个滑动手势只会移动到下一个或上一个 fragment(或页面,如果您愿意)。你能重新表述一下吗?
  • 您可能必须编写一大段代码才能做到这一点,但我会更关心用户体验。如果用户滑动并且有时页面滚动,有时它不会滚动,这将是令人困惑的。您可能会考虑一个不同的视图,其中有一个左右按钮,用户通过使用按钮而不是滚动来移动页面。
  • 但是,如果您绝对必须这样做,可能最简单的方法是修改 ViewPager 的适配器,使其仅提供三个页面:显示的页面、左侧的页面和右边的那个。然后当用户选择下一页时,通过使下一页成为当前页来更新适配器,并再次返回一个三页集,只移动了一页。
  • 您在此处指定的问题不会发生在视图寻呼机上。它发生在画廊的情况下。
  • 我添加了 gif 图片来详细解释我在说什么。

标签: android android-viewpager


【解决方案1】:

好的,我认为答案是:扩展ViewPager 并覆盖onTouchEvent(MotionEvent ev)

private Rect viewRect = new Rect();

@Override
public boolean onTouchEvent(MotionEvent event) {

    getHitRect(viewRect);

    if (viewRect.contains(
        Math.round(view.getX() + event.getX()),
        Math.round(view.getY() + event.getY()))) {

        // touch is inside, do normal behavior
        return super.onTouchEvent(event);
    } else {
        // touch is outside, consume the event & do nothing
        return true;
    }
}

很遗憾,现在没有时间真正测试它,我稍后会更新。

【讨论】:

  • 这并不能真正按预期工作。如果您从中心开始滑动,一旦您将手指移到寻呼机外,移动就会停止。
  • 我在想我可以用 onTouchEvent 做点什么,只是不知道是什么。这个答案给了我一个想法。我回家看看能不能用。
【解决方案2】:

最后,我最终在适配器中完成了它。我所做的是在 getCount 方法中返回 2,在选择后重新排列项目,并特别处理使用当前位置(0 或 1)访问数据集中的项目时的情况。

【讨论】:

    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多