1、为什么会有事件分发机制
安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件会给谁呢?为了解决这一问题,就有了事件分发机制。
2、三个重要的事件分发方法
2.1 dispatchTouchEvent()
2.2 onInterceptTouchEvent()
2.3 onTouchEvent()
3、事件分发流程
Activity->PhoneWindow->DecorView->ViewGroup->...->View
事件分发流程
Activity
dispatchTouchEvent-返回值是True/false事件由自己消费,Super事件传递给子View(ViewGroup)的dispatchTouchEvent()。
ViewGroup
dispatchTouchEvent-返回值是True事件由自己消费,返回值是false事件交由父View的onTouchEvent()处理。Super事件传递给自己的onInterceptTouchEvent()进行事件分发。
onInterceptTouchEvent-返回值是True事件由自己onTouchEvent()处理,返回值是false或者是Super事件交由子View的dispatchTouchEvent()进行处理。
View
dispatchTouchEvent-返回值是True事件由自己消费,返回值是false事件交由父View的onTouchEvent()处理,返回值是Super事件交由自己的onTouchEvent()处理。
onTouchEvent-返回值是True事件自己消费,返回值是false、Super事件交由父View的onTouchEvent()处理。直至传递到Activity的onTouchEvent()
OnTouchListener和OnClickListener执行顺序
当一个View需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被回调。这时事件如何处理还要看onTouch的返回值,如果返回false,则当前View的onTouchEvent方法会被调用,如果返回true,那么onTouchEvent方法将不会调用。由此可见,给View设置的OnTouchListener,其优先级比onTouchEvent要高。
在onTouchEvent方法中,如果当前设置的有OnClickListener,那么它的onClick方法会被调用。可以看出,平时我们常用的OnClickListener,其优先级最低,即处于事件传递的尾端
结论
onTouch->onTouchListener->onTouchEvent->onClick->onClickListener