Android View 事件分發(fā)機(jī)制
// Activity.dispatchTouchEvent()
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
// PhoneWindow.superDispatchTouchEvent()
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
// DecorView.superDispatchTouchEvent()
public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
// ViewGroup.dispatchTouchEvent()
public boolean dispatchTouchEvent(MotionEvent ev) {
if (actionMasked == MotionEvent.ACTION_DOWN) {
resetTouchState();// 重置FLAG_DISALLOW_INTERCEPT
}
/**
1、ViewGroup不攔截事件 -> mFirstTouchTarget != null
2育韩、ViewGroup攔截事件 -> mFirstTouchTarget == null
3卓嫂、ViewGroup攔截事件 -> ACTION_MOVE和ACTION_UP的onInterceptTouchEvent不執(zhí)行
4耸黑、ACTION_DOWN -> onInterceptTouchEvent必執(zhí)行
5没炒、requestDisallowInterceptTouchEvent -> ViewGroup無法攔截非ACTION_DOWN事件
*/
if (actionMasked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null) {
disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
if (!disallowIntercept) {
intercepted = onInterceptTouchEvent(ev);
} else {
intercepted = false;
}
} else {
intercepted = true;
}
if (!intercepted) {
final View[] children = mChildren;
for (int i = childrenCount - 1; i >= 0; i--) {
View child = children[childIndex];
// 子元素是否在播動畫 || 點(diǎn)擊事件坐標(biāo)是否在子元素區(qū)域內(nèi)
if (!canViewReceivePointerEvents(child)
|| !isTransformedTouchPointInView(x, y, child)) {
continue;
}
newTouchTarget = getTouchTarget(child);
// -> child.dispatchTouchEvent
if (dispatchTransformedTouchEvent(ev, false, child)) {
// 設(shè)置mFirstTouchTarget
newTouchTarget = addTouchTarget(child);
break;
}
}
}
/**
1米奸、ViewGroup沒有子元素毙籽;
2役首、child.dispatchTouchEvent -> false : child.onTouchEvent -> false
*/
if (mFirstTouchTarget == null) {
// -> super.dispatchTouchEvent
handled = dispatchTransformedTouchEvent(ev, canceled, null);
}
return handled;
}
// View.dispatchTouchEvent()
public boolean dispatchTouchEvent(MotionEvent event) {
// mOnToucheListener.onTouch : true -> onTouchEvent不執(zhí)行
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
return result;
}
// View.onTouchEvent()
public boolean onTouchEvent(MotionEvent event) {
// if(CLICKABLE || LONG_CLICKABLE) : onTouchEvent -> true
if ((viewFlags & ENABLED_MASK) == DISABLED) {
return (((viewFlags & CLICKABLE) == CLICKABLE
|| (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (action) {
case MotionEvent.ACTION_UP:
performClick();// -> onClick()
break;
}
return true;
}
return false;
}
/**
1步绸、ViewGroup -> dispatchTouchEvent 掺逼、onInterceptTouchEvent
2、View -> dispatchTouchEvent 瓤介、onTouchEvent
*/
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if(onInterceptTouchEvent(ev)){
// super.dispatchTouchEvent -> View.dispatchTouchEvent -> onTouchEvent
consume = onTouchEvent(ev);
}else{
// View || ViewGroup -> dispatchTouchEvent
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者