大家经常会使用ViewPager+Fragment,然后在fragment中会有左右滑动的view,当view滑动到最右边时会自动滑到viewpager的下一个item,如果项目要求ViewPager禁止自动滑动,这自定义的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; }@Overridepublic void scrollTo(int x, int y) { super.scrollTo(x, y); }@Overridepublic boolean onTouchEvent(MotionEvent arg0) { if (noScroll) return false; else return super.onTouchEvent(arg0); }@Overridepublic boolean onInterceptTouchEvent(MotionEvent arg0) { if (noScroll) return false; else return super.onInterceptTouchEvent(arg0); }@Overridepublic void setCurrentItem(int item, boolean smoothScroll) { super.setCurrentItem(item, smoothScroll); }@Overridepublic void setCurrentItem(int item) { super.setCurrentItem(item); }
}
用法 在xml中引入,在activity中viewpager.setNoScroll(true);就行了
其实就是处理了一下点击事件,
public boolean onInterceptTouchEvent(MotionEvent ev)
该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的view进行处理。
return false : 不对事件进行拦截,放行该事件。事件会被传递到当前view的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理。 return true : 拦截该事件,将该事件交给当前view的onTouchEvent方法进行处理。 return super.inInterceptTouchEvent(ev):默认拦截方式,和return true一样。该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。
我的理解是NoScrollViewPager中的onInterceptTouchEvent方法返回了了false,则没有消费此事件,会想下传递,但是他又没有子View了!!!
我也就个人理解,,欢迎大家指正!