(二)dispatchTouchEvent方法
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
(三)onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
此處如果返回true時候,再dispatchTouchEvent方法中
if (!result && onTouchEvent(event)) {
result = true;
}
return result ;
dispatchTouchEvent就返回true策治。
private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,
View child, int desiredPointerIdBits) {
final boolean handled;
// Canceling motions is a special case. We don't need to perform any transformations
// or filtering. The important part is the action, not the contents.
final int oldAction = event.getAction();
if (cancel || oldAction == MotionEvent.ACTION_CANCEL) {
event.setAction(MotionEvent.ACTION_CANCEL);
if (child == null) {
handled = super.dispatchTouchEvent(event);
} else {
//此時返回true
handled = child.dispatchTouchEvent(event);
}
event.setAction(oldAction);
return handled;
}
此時返回ViewGroup方法中帆吻,返回Handled。
//此處進入dispatchTransformedTouchEvent方法中活鹰,內(nèi)部調(diào)用addTouchTarget无畔,給touch做上標記
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {
// Child wants to receive touch within its bounds.
mLastTouchDownTime = ev.getDownTime();
if (preorderedList != null) {
// childIndex points into presorted list, find original index
for (int j = 0; j < childrenCount; j++) {
if (children[childIndex] == mChildren[j]) {
mLastTouchDownIndex = j;
break;
}
}
} else {
mLastTouchDownIndex = childIndex;
}
mLastTouchDownX = ev.getX();
mLastTouchDownY = ev.getY();
newTouchTarget = addTouchTarget(child, idBitsToAssign);
alreadyDispatchedToNewTouchTarget = true;
break;
}
此處break直接退出循環(huán)辽装,其他子View不會獲得event事件。
private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits) {
final TouchTarget target = TouchTarget.obtain(child, pointerIdBits);
target.next = mFirstTouchTarget;
mFirstTouchTarget = target;
return target;
}
此處進入addTouchTarget方法代兵,進行標記尼酿。mFirstTouchTarget的傳給touch的下一個引用。