當在指定頁面觸發MotionEvent事件時,首先進入Activity的dispatchTouchEvent方法java
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
複製代碼
具體的工做由Activity的Window完成,window的實現類爲PhoneWindowbash
mWindow = new PhoneWindow(this, window, activityConfigCallback);
複製代碼
PhoneWindow的superDispatchTouchEvent方法將事件傳遞給mDecor, DecorView通常就是當前界面的底層容器,也就是setContentView所設置的父容器,也就是到達了頂層ViewGroup。ide
mDecor = (DecorView) preservedWindow.getDecorView();
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
複製代碼
點擊事件到達頂級ViewGroup,先調用ViewGroup的dispatchTouchEvent方法.ui
public boolean dispatchTouchEvent(MotionEvent event){
if(onInterceptTouchEvent(event)){
return onTouchEvent(event);
}else{
return child.dispatchTouchEvent(event);
}
}
複製代碼
本身攔截處理就調用本身的onTouchEvent,此時若是設置了onTouchListener,onTouch方法也會被調用,onTouch會屏蔽onTouchEvent,不然會調用onTouchEvent。this
在onTouchEvent中若是設置了onClickListener則,onClick會被調用。spa
本身不處理就調用當前位置的子View的dispatch方法。code