当前位置: 首页 > 知识库问答 >
问题:

ViewPager禁用滑动到某个方向

林鹏鹍
2023-03-14

我想禁用刷卡,但仅限于右侧。我在这个答案中找到了一个有效的解决方案。不幸的是,这复制了整个ViewPager源代码以实现目标。有没有只继承现有类而不复制的方法?

共有3个答案

司寇琨
2023-03-14

另一种简单的方法是使用setCurrentItem()在点击某个位置时滚动回所需的幻灯片。例如,这将只允许向前滑动:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    @Override
    public void onPageSelected(int position) {
        if(position < mProgress) {
            mViewPager.setCurrentItem(mProgress, true);
        } else {
            mProgress = position;
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {}
});

或者,如果您想使用max slide:

if(position > 4) {
    mViewPager.setCurrentItem(4, true);
}

解决方案在技术上不会完全禁用滑动,因为当您进行滑动运动时,您仍然会看到不允许的滑动的一小部分。但对于某些应用,这可能是优选的。

谭飞掣
2023-03-14

这是一个可以禁用任何方向分页的ViewPager类。在这里查看所有答案。

public class CustomViewPager extends ViewPager {
    private float initialXValue;
    private SwipeDirection direction;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.direction = SwipeDirection.all;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.IsSwipeAllowed(event)) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.IsSwipeAllowed(event)) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    private boolean IsSwipeAllowed(MotionEvent event) {
        if(this.direction == SwipeDirection.all) return true;

        if(direction == SwipeDirection.none )//disable any swipe
            return false;

        if(event.getAction()==MotionEvent.ACTION_DOWN) {
            initialXValue = event.getX();
            return true;
        }

        if(event.getAction()==MotionEvent.ACTION_MOVE) {
            try {
                float diffX = event.getX() - initialXValue;
                if (diffX > 0 && direction == SwipeDirection.right ) {
                    // swipe from left to right detected
                    return false;
                }else if (diffX < 0 && direction == SwipeDirection.left ) {
                    // swipe from right to left detected
                    return false;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }

        return true;
    }

    public void setAllowedSwipeDirection(SwipeDirection direction) {
        this.direction = direction;
    }
穆修杰
2023-03-14

我不确定这正是您所需要的:我需要一个用于向导的viewpager,该向导具有用户无法通过的最大页面。

最后,解决方案在适配器中。我改变了PagerAdapter的计数,这种方式阻止用户通过最大页面:

@Override
public int getCount() {
    return mProgress; //max page + 1
}

当用户进入下一个页面时:

private void setWizardProgress(int progress) {
    if(progress > mProgress) {
        mProgress = progress;
        mWizardPagerAdapter.notifyDataSetChanged();
    }
}

这样,当用户处于max page时,他无法向右滚动。

 类似资料:
  • 本文向大家介绍Android中Viewpager禁止滑动的实现,包括了Android中Viewpager禁止滑动的实现的使用技巧和注意事项,需要的朋友参考一下 前言 现在很多app,首页不允许滑动切换(因为页面加载吧),但是又用viewpage来管理frgament.因为方便嘛. 以前在网上找的例子: 这个自定义如果继承的Viewpager是低版本的,那么是没问题的. 但是如果你编译时用是高版本的

  • 本文向大家介绍Android之禁止ViewPager滑动实现实例,包括了Android之禁止ViewPager滑动实现实例的使用技巧和注意事项,需要的朋友参考一下 Android之禁止ViewPager滑动实现实例 当我们想在同一个Activity或者Fragment中展示多个页面时往往会用到ViewPager,通过滑动,我们可以很方便地在不同的页面中切换。但是在某些情况下我们可能并不需要通过滑动

  • 我有一个活动,带有一个可视页面,涵盖了整个活动。在这个ViewPager中是一个ListView,它只覆盖片段的底部。ListView可以识别滑动事件(您可以左右滑动项目),但当您想滑动列表项目时,ViewPager会切换页面,因此无法工作。有没有一种简单的方法来解决这个问题,这样ViewPager就不会收到列表中的触摸事件。 谢谢

  • 有没有办法禁用滑动手势来打开导航抽屉?在标签之间滑动时出现菜单真的很烦人。

  • 我想在查看页面2中禁用从右向左滑动。我基本上有一个viewpager2元素,在导航抽屉中有两页。我希望我的第二页仅在单击第一页中的某个元素时显示(从第一页向右向左滑动不应打开第二页),而当我在第二页时,viewpager2滑动(从左向右滑动)应像在viewpager中一样滑动。 我尝试过扩展类并覆盖触摸事件,但不幸的是它是最终类,因此我无法扩展它。 其次,我尝试使用将userinputened设置

  • 本文向大家介绍ViewPager 滑动一半的判断方法以及左滑右滑判断实例,包括了ViewPager 滑动一半的判断方法以及左滑右滑判断实例的使用技巧和注意事项,需要的朋友参考一下 做项目的时候,会碰到用viewpager + fragments去实现多页滑动。有些时候需要完成:界面在滑动到一半或是一半以上的时候,需要把title之类的切换到下一个页面。这个时候仅仅依赖Viewpager的接口是不能