1. 程式人生 > >Android事件傳遞流程-虛擬碼

Android事件傳遞流程-虛擬碼

傳遞流程

Activity > ViewGroup > View

Activity

public boolean dispatchTouchEvent(MotionEvent ev) {

      //呼叫ViewGroup的方法dispatchTouchEvent    
      if (viewGroup.dispatchTouchEvent(ev)) {
          return true;
      }
      return onTouchEvent(ev);
}

ViewGroup

public boolean dispatchTouchEvent
(MotionEvent ev) { final int action = ev.getAction(); //如果是ACTION_DOWN事件 if (action == MotionEvent.ACTION_DOWN) { //如果當前viewGroup不攔截事件:onInterceptTouchEvent返回false if (disallowIntercept || !onInterceptTouchEvent(ev)) { for (int i = count - 1; i >= 0; i--) { final
View child = children[i]; //呼叫child的dispatchTouchEvent方法 if (child.dispatchTouchEvent(ev)) { //如果子view消費了事件,直接返回true,並設定到成員變數mMotionTarget中 mMotionTarget = child; return true; } } } } final
View target = mMotionTarget; //target為null代表沒有子view消費ACTION_DOWN事件 if (target == null) { //呼叫view的dispatchTouchEvent方法 return super.dispatchTouchEvent(ev); } //呼叫子view的dispatchTouchEvent方法 return target.dispatchTouchEvent(ev); }

View

public boolean dispatchTouchEvent(MotionEvent event) {  
    //優先呼叫onTouch方法
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
            mOnTouchListener.onTouch(this, event)) {  
        //如果onTouch返回true,則直接返回    
        return true;  
    }  
    //呼叫onTouchEvent方法
    //這個方法裡面會呼叫onClick方法
    return onTouchEvent(event);  
}
  1. 情況1
- Activity ViewGroup View
ACTION_DOWN 不處理 不處理 不處理
ACTION_MOVE 不處理 不處理 不處理
ACTION_UP 不處理 不處理 不處理

2.情況2

- Activity ViewGroup View
ACTION_DOWN 不處理 不處理 處理
ACTION_MOVE 不處理 不處理 處理
ACTION_UP 不處理 不處理 處理

3.情況3

- Activity ViewGroup View
ACTION_DOWN 不處理 處理 不處理
ACTION_MOVE 不處理 處理 不處理
ACTION_UP 不處理 不理 不處理

4.情況4

- Activity ViewGroup View
ACTION_DOWN 處理 不處理 不處理
ACTION_MOVE 處理 不處理 不處理
ACTION_UP 處理 不處理 不處理

參考資料