前言
現(xiàn)在很多app,首頁不允許滑動切換(因為頁面加載吧),但是又用viewpage來管理frgament.因為方便嘛.
以前在網(wǎng)上找的例子:
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//不攔截,否則子孩子都無法收到事件,一般這個自定義的時候都不作處理
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
這個自定義如果繼承的Viewpager是低版本的,那么是沒問題的.
但是如果你編譯時用是高版本的api,5.0以后吧.上面這個自定義就會失效,
你會發(fā)現(xiàn),會有細(xì)微的滑動.還是能滑動的
判斷老的還是新的,看setOnPageChangeListener就知道了
最新的Viewpager里面這個方法已經(jīng)廢棄了,改成addOnPageChangeListener()了.
由于之前改viewpager做懶加載.一直保留了一個老版本的Viewpager使用.直到最近才發(fā)現(xiàn).
改進后
public class NoScrollViewPager extends ViewPager {
private boolean isScroll;
public NoScrollViewPager(Context context,AttributeSetattrs{
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
/**
* 1.dispatchTouchEvent一般情況不做處理
*,如果修改了默認(rèn)的返回值,子孩子都無法收到事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev); // return true;不行
}
/**
* 是否攔截
* 攔截:會走到自己的onTouchEvent方法里面來
* 不攔截:事件傳遞給子孩子
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// return false;//可行,不攔截事件,
// return true;//不行,孩子無法處理事件
//return super.onInterceptTouchEvent(ev);//不行,會有細(xì)微移動
if (isScroll){
return super.onInterceptTouchEvent(ev);
}else{
return false;
}
}
/**
* 是否消費事件
* 消費:事件就結(jié)束
* 不消費:往父控件傳
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//return false;// 可行,不消費,傳給父控件
//return true;// 可行,消費,攔截事件
//super.onTouchEvent(ev); //不行,
//雖然onInterceptTouchEvent中攔截了,
//但是如果viewpage里面子控件不是viewgroup,還是會調(diào)用這個方法.
if (isScroll){
return super.onTouchEvent(ev);
}else {
return true;// 可行,消費,攔截事件
}
}
public void setScroll(boolean scroll) {
isScroll = scroll;
}
}