Android事件傳遞流程-虛擬碼
阿新 • • 發佈:2019-02-12
傳遞流程
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
- | 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 | 處理 | 不處理 | 不處理 |