如何通过在ViewPager中用手指轻扫来禁用分页,但是仍然能够以编程方式轻扫?

本文翻译自:How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?

I have ViewPager and below it I have 10 buttons. 我有ViewPager,在它下面有10个按钮。 By clicking on button, for example #4, the pager goes immediately to page #4 by mPager.setCurrentItem(3); 通过单击按钮,例如#4,通过mPager.setCurrentItem(3); ,寻呼机立即转到第4页mPager.setCurrentItem(3); . But, I want to disable the paging by swiping with finger horizontally. 但是,我想通过水平滑动手指来禁用分页。 Thus, the paging is done ONLY by clicking on the buttons. 因此, 只能通过单击按钮来完成分页。 So, how I can disable the swiping with finger? 那么,如何禁用手指滑动?


#1楼

参考:https://stackoom.com/question/eUTR/如何通过在ViewPager中用手指轻扫来禁用分页-但是仍然能够以编程方式轻扫


#2楼

The simplest way is to setOnTouchListener and return true for ViewPager . 最简单的方法是setOnTouchListener并为ViewPager返回true

mPager.setOnTouchListener(new OnTouchListener()
    {           
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            return true;
        }
    });

#3楼

The more general extension of ViewPager would be to create a SetPagingEnabled method so that we can enable and disable paging on the fly. ViewPager的更一般的扩展是创建SetPagingEnabled方法,以便我们可以即时启用和禁用分页。 To enable / disable the swiping, just overide two methods: onTouchEvent and onInterceptTouchEvent . 要启用/禁用刷卡,只需覆盖两个方法: onTouchEventonInterceptTouchEvent Both will return "false" if the paging was disabled. 如果禁用分页,则两者都将返回“ false”。

public class CustomViewPager extends ViewPager {

    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

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

        return false;
    }

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

        return false;
    }

    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    } 
}

Then select this instead of the built-in viewpager in XML 然后选择它而不是XML中的内置viewpager

<mypackage.CustomViewPager 
    android:id="@+id/myViewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" />

You just need to call the setPagingEnabled method with false and users won't be able to swipe to paginate. 您只需要使用false调用setPagingEnabled方法,用户将无法滑动以进行分页。


#4楼

Better to declare it styleable, so you can change its property from xml: 最好声明它为可样式化,因此可以从xml更改其属性:

private boolean swipeable;

public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try {
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
    } finally {
        a.recycle();
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return swipeable ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return swipeable ? super.onTouchEvent(event) : false;
}

And in your values/attr.xml: 并在您的values / attr.xml中:

<declare-styleable name="MyViewPager">
  <attr name="swipeable" format="boolean" />
</declare-styleable>

so that you can use it in you layout xml: 这样就可以在布局xml中使用它:

<mypackage.MyViewPager
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:swipeable="false" />

Of course, you can still have a get/set property. 当然,您仍然可以拥有一个get / set属性。


#5楼

I needed to disable swiping on one specific page, and give it a nice rubber-band animation, here's how: 我需要禁用在特定页面上的滑动,并给它一个漂亮的橡皮筋动画,方法如下:

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            if (position == MANDATORY_PAGE_LOCATION && positionOffset > 0.5) {
                mViewPager.setCurrentItem(MANDATORY_PAGE_LOCATION, true);
            }
        }

#6楼

Another easy solution to disable swiping at specific page (in this example, page 2): 禁用特定页面(在此示例中为第2页)上的滑动的另一种简单解决方案:

int PAGE = 2;
viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        if (viewPager.getCurrentItem() == PAGE) {
                viewPager.setCurrentItem(PAGE-1, false);
                viewPager.setCurrentItem(PAGE, false);
                return  true;
        }
        return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值