NoScrollViewPager

128 篇文章 0 订阅

禁止滑动的NoScrollViewPager
对于一个搞Android开发的,想必大家会经常使用ViewPager+Fragment,然后在主界面中会有tabView,用于和ViewPager的联动,当点击tabView的item时,ViewPager也会自动切换到对应的Fragment,当滑动ViewPager时,TabView也会滑动到对应的item;但是有些时候为了项目要求ViewPager禁止滑动,只能通过点击TabView的item来切换,那今天我们所讲的ViewPager就对你有用了!话不多说,请看如下代码:

public class NoScrollViewPager extends ViewPager {

private boolean noScroll = false;

public NoScrollViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public NoScrollViewPager(Context context) {
    super(context);
}

public void setNoScroll(boolean noScroll) {
    this.noScroll = noScroll;
}

@Override
public void scrollTo(int x, int y) {
    super.scrollTo(x, y);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
    if (noScroll)
        return false;
    else
        return super.onInterceptTouchEvent(arg0);
}

@Override
public void setCurrentItem(int item, boolean smoothScroll) {
    super.setCurrentItem(item, smoothScroll);
}

@Override
public void setCurrentItem(int item) {
    super.setCurrentItem(item);
}
用法就是在xml当中引入,替换掉原生的ViewPager;然后在主Activity的onCreate()当中设置mViewPager.setNoScroll(true),就可以了。
其实也很简单,对于了解View绘制过程和事件分发过程随手都能写出来的,可以看到,我写一个类继承了原生的ViewPager,然后重写了onInterceptTouchEvent(MotionEvent event)及添加了setNoScroll(boolean noScroll)方法
onInterceptTouchEvent该方法判断是否拦截上面传递过来的事件,即是否需要当前的View进行处理。 
- return false: 不对事件进行拦截,放行该事件。事件会被传递到当前的View的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理 
- return true: 拦截该事件,将该事件交给当前View的onTouchEvent方法进行处理 
- return super.onInterceptTouchEvent(event):默认拦截方式,和return true一样,该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。

总结 
我的理解是NoScrollViewPager中的onInterceptTouchEvent方法返回了false,则没有消费此事件,会向下传递,但是他又没有子View了,会结束事件分发,也不会调用父类的滑动事件!!! 
我也就个人理解,,欢迎大家指正!
--------------------- 
作者:five-lei 
来源:CSDN 
原文:https://blog.csdn.net/yilei0033/article/details/79444099 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值