最近在看事件分发方面的知识,主要看了郭神之前的文章Android事件分发机制完全解析,文章由浅入深讲解很细致清晰。里面有这样一句话
“Android中touch事件的传递,绝对是先传递到ViewGroup,再传递到View的”
看到这里就一直想要知道,touch事件是怎么传递到viewgroup的,搜了几篇文章也都没讲清楚。直到看到这篇Android FrameWork——Touch事件派发过程详解,看完不禁无限佩服与感激,解决了我的疑惑,在这里记录下摘要,以备后查。
首先,当手指触摸屏幕,会先走activity的dispatchTouchEvent(MotionEvent ev)方法
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
至于为什么走这个方法,该篇文章有详细的讲解,这里就不再深究。这里getWindow()返回的就是PhoneWindow对象,执行superDispatchTouchEvent,就是执行PhoneWindow.superDispatchTouchEvent。这里我们可以看到,如果superDispatchTouchEvent返回true,就不会执行下面的onTouchEvent(ev)方法,此时代表着有子view处理了touch事件。如果返回false,说明没有子view处理事件,最后会返给activity处理。
我们再看PhoneWindow.superDispatchTouchEvent:
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
--> public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
}
superDispatchTouchEvent最终调用super.dispatchTouchEvent。这里mDector是PhoneWindow.DecorView,它是一个真正Activity的root view,它继承了FrameLayout,通过super.dispatchTouchEvent他会把touchevent派发给各个activity的子view,也就是我们在Activity.onCreat方法中setContentView时设置的view。这里的view最外层都是布局view,也就是都继承了viewgroup,由此,touch事件传递到了viewgroup中。后面的事件分发过程,看完郭神的博客你一定都明白啦。