当在指定页面触发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