`mFirstTouchTarget` 是 `ViewGroup` 內部的一個鏈表節點(`TouchTarget`),指向第一個消費(處理)了當前觸摸事件序列的子 View。若無子 View 消費事件,則為 `null`。
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mFirstTouchTarget = null; // 重置
}
boolean intercepted = false;
if (onInterceptTouchEvent(ev)) { // 只有 mFirstTouchTarget==null 時才進這裡
intercepted = true;
}
if (!intercepted && mFirstTouchTarget == null) {
// 遍歷子 View 分發
for (View child : children) {
if (child.dispatchTouchEvent(ev)) {
mFirstTouchTarget = new TouchTarget(child);
break;
}
}
} else if (mFirstTouchTarget != null) {
// 直接給已捕獲的子 View
mFirstTouchTarget.child.dispatchTouchEvent(ev);
}
return mFirstTouchTarget != null || intercepted;
}
理解 `mFirstTouchTarget` 為「首個消費者」的標記,即可掌握事件分發的攔截與分發節奏。