禁止滑动的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
来源:优快云
原文:https://blog.youkuaiyun.com/yilei0033/article/details/79444099
版权声明:本文为博主原创文章,转载请附上博文链接!