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

相關文章
相關標籤/搜索