Android事件分发的源码梳理

Activity事件分发

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

相关文章
相关标签/搜索