事件分发机制详解

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

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

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

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

3、事件分发流程

Activity->PhoneWindow->DecorView->ViewGroup->...->View
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容