禁止滑動的NoScrollViewPager

daxuesheng發表於2021-09-09

大家經常會使用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了!!!
我也就個人理解,,歡迎大家指正!

原文連結:http://www.apkbus.com/blog-842132-76752.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2812858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章