Viewpager禁止滑動 前言

前言

現在很多app,首頁不允許滑動切換(因爲頁面加載吧),但是又用viewpage來管理frgament.因爲方便嘛.

以前在網上找的例子:

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以後吧.上面這個自定義就會失效,

你會發現,會有細微的滑動.還是能滑動的

判斷老的還是新的,看setOnPageChangeListener就知道了

最新的Viewpager裏面這個方法已經廢棄了,改成addOnPageChangeListener()了.

由於之前改viewpager做懶加載.一直保留了一個老版本的Viewpager使用.直到最近才發現.

改進後

public class NoScrollViewPager extends ViewPager {   
private boolean isScroll;
public NoScrollViewPager(Context context,AttributeSetattrs{  
    super(context, attrs);  
 }  
 public NoScrollViewPager(Context context) {      
     super(context);  
 }   
/** 
  * 1.dispatchTouchEvent一般情況不做處理
  *,如果修改了默認的返回值,子孩子都無法收到事件   
   */ 
  @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);//不行,會有細微移動  
    if (isScroll){  
         return super.onInterceptTouchEvent(ev);
    }else{  
         return false;
    } 
}  
 /**  
  * 是否消費事件 
  * 消費:事件就結束  
  * 不消費:往父控件傳   
 */   
@Override 
  public boolean onTouchEvent(MotionEvent ev) {    
   //return false;// 可行,不消費,傳給父控件   
   //return true;// 可行,消費,攔截事件  
   //super.onTouchEvent(ev); //不行,
   //雖然onInterceptTouchEvent中攔截了,
   //但是如果viewpage裏面子控件不是viewgroup,還是會調用這個方法. 
    if (isScroll){
         return super.onTouchEvent(ev);
    }else {  
         return true;// 可行,消費,攔截事件
    }
  }
  public void setScroll(boolean scroll) {
      isScroll = scroll;
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章