首先,我們假設這樣一個場景:一個ViewPager里面嵌套一個ViewPager,內部滑動方向和外部滑動方向一樣時,該怎么解決這一沖突呢? 
針對滑動沖突這里給出兩種解決方案:外部攔截法,內部攔截法。
外部攔截法
外部攔截法是指點擊事件都先經過父容器的攔截處理,如果父容器需要此攔截事件,就攔截,不需要就不攔截,這種方法比較符合點擊事件的分發機制。這種方法代碼如下:
@Override  public boolean onInterceptTouchEvent(MotionEvent ev) {    ...    boolean intercepted=false;    switch (action) {      case MotionEvent.ACTION_MOVE:        intercepted=false;        break;      case MotionEvent.ACTION_MOVE:        if(父容器需要處理此事件)          intercepted=true;        else          intercepted=false;        break;      case MotionEvent.ACTION_UP: {        intercepted=false;        break;    }    ...    return intercepted;  }上述代碼是外部攔截的典型邏輯,只需要重寫onInterceptTouchEvent()方法,修改父容器當前需要的事件即可。
內部攔截法
內部攔截法是指:父容器不攔截任何事件,所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則就交由父容器處理。這種方法與Android中的事件分發機制不一致,需要配合 requestDisallowInterceptTouchEvent()方法才能正常工作。我們需要重寫子元素的,代碼如下:
public boolean dispatchTouchEvent(MotionEvent event) {    ...    switch (action) {      case MotionEvent.ACTION_MOVE:            getParent().requestDisallowInterceptTouchEvent(true);        break;      case MotionEvent.ACTION_MOVE:        if(子元素需要處理此事件)              getParent().requestDisallowInterceptTouchEvent(true);        break;      case MotionEvent.ACTION_UP: {        break;    }    ...    return super.dispatchTouchEvent(event);;  }當然,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:
@Override  public boolean onInterceptTouchEvent(MotionEvent ev) {      int action=ev.getAction();      if(action==MotionEvent.ACTION_DOWN){        return false;      }else {        return true;      }    }以上就是兩種解決滑動沖突的解決方案,希望對大家的學習有所幫助。
| 
 
 | 
新聞熱點
疑難解答