简述
点击事件的传递顺序为:Activity -> Window -> View
主要的函数为:dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent
源码解析
那么我们先从Activity来看
当手机点击屏幕的时候,首先会触发Activity的dispatchTouchEvent 方法
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction(); //activity在栈顶时,用户对手机:触屏点击,按home,back,menu键都会触发此方法
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
就俩个if判断,上面那个看名字跟我们需要看的东西没什么关联,那么我们来到下面这个if判断,getWindow().superDispatchTouchEvent(ev)我们跟进去看这段
首先getWindow(),在我们看过setContentView的源码之后我们知道这个东西的实例是PhoneWindow得来的,那么我们来到PhoneWindow下的superDispatchTouchEvent
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event); //mDecor是什么东西
}
//DecorView.java下的
public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
其实,mDecor这个东西在看过setContentView的源码之后也知道,这个东西其实就是在我们每次调用setContentView的时候,会先添加一个R.id.content的布局,然后再将我们的布局添加上去,在这里的mDecor也就是我们的最顶级的View,继承于FrameLayout,来到DecorView下的superDispatchTouchEvent,也是调用父类的dispatchTouchEvent,前面说到DecorView是继承于FrameLayout的,那么自然就调用到ViewGroup的dispatchTouchEvent,到这里点击事件就从Activity传递到ViewGroup去了。
网友评论