事件分发机制详解

1、为什么会有事件分发机制

安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件会给谁呢?为了解决这一问题,就有了事件分发机制。

2、三个重要的事件分发方法

2.1 dispatchTouchEvent()
2.2 onInterceptTouchEvent()
2.3 onTouchEvent()

3、事件分发流程

Activity->PhoneWindow->DecorView->ViewGroup->...->View
事件分发机制详解_第1张图片
944365-aa8416fc6d2e5ecd.png

事件分发流程

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

你可能感兴趣的:(事件分发机制详解)