Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android滑動事件沖突詳解(一)

Android滑動事件沖突詳解(一)

編輯:關於Android編程

首先,我們假設這樣一個場景:一個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;
      }
    }

以上就是兩種解決滑動沖突的解決方案,希望對大家的學習有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved