前言在日常开发过程中,可能会遇到这些问题:滑动冲突、点击事件响应冲突等问题 。那么造成这些问题的根源到底是什么呢?其实这都是Android事件分发导致的,只有掌握了事件分发机制,才能让我们从根源上理解并解决这类问题 。
事件分发对象事件分发过程中,涉及到三种UI对象类型:Activity、ViewGroup、View 及其派生类 。三者之间的关系如下图:
文章插图
发生一次点击事件时,事件会按照Activity->ViewGroup->View的顺序,进行事件传递 。
- Activity:控制UI页面的生命周期,是事件分发的入口 。
- ViewGroup:View的特殊子类,是一组View的集合,是Android中所有布局的父类 。
- View:所有UI组件的基类,常见的Button、TextView等控件都继承自View 。
事件整体分发流程
文章插图
事件分发流程图
在整个事件分发,并响应事件的过程中,有三个重要的方法:
- dispatchTouchEvent:分发(传递)点击事件,当点击事件能够传递给当前View时,该方法就会被调用 。
- onInterceptTouchEvent:判断是否拦截某个事件,该方法仅在ViewGroup中存在 。一般情况下会在ViewGroup的dispatchTouchEvent方法中调用该方法 。
- onTouchEvent:处理点击事件,在dispatchTouchEvent内部调用 。
- boolean dispatchTouchEvent(MotionEvent ev):事件分发
- boolean onTouchEvent(MotionEvent event):事件消费
文章插图
Activity事件分发流程
ViewGroup事件分发流程ViewGroup 涉及到三个事件分发与处理的方法:
- dispatchTouchEvent(MotionEvent ev):事件分发
- onIntercepTouchEvent(MotionEvent ev):事件拦截
- onTouchEvent(MotionEvent ev):事件消费
文章插图
ViewGroup事件分发流程图
【Android 事件分发机制】ViewGroup通过dispatchTouchEvent()方法接收到事件,然后根据ViewGroup onInterceptTouchEvent()方法的返回值判断:
- 返回true,则调用ViewGroup的onTouchEvent()方法,如果消费了事件,则事件传递结束,如果不消费事件,则事件传递回Activity并执行Activity的onTouchEvent()方法;
- 返回false,则将事件传递给子View,由子View继续完成事件向下分发 。
- dispatchTouchEvent(MotionEvent ev):事件分发
- onTouchEvent(MotionEvent ev):事件消费
文章插图
View事件分发流程图
View通过dispatchTouchEvent方法接收到从ViewGroup传递过来的事件后,直接调用 onTouchEvent方法处理事件 。如果没有消费事件,则调用ViewGroup的onTouchEvent方法处理事件,然后继续ViewGroup事件流程;如果消费了该事件,则分发结束 。
推荐阅读
- 谷歌|第一款Android 13旗舰已在路上 谷歌Pixel 7系列10月登场
- 水门事件发生了什么(水门事件的前因后果)
- 苹果|威尔·史密斯耳光事件后首度发声
- 电影|威尔史密斯发布奥斯卡掌掴事件道歉视频:我一直在反思
- 豪车|雷克萨斯豪车发生交通事故车门锁死 官方声明:密切关注事件调查进展
- Android 使用git合入修改patch
- 谷歌对Android 13的Beta 4.1进行最后润色,9月推出稳定版更新
- 莫雷又说了什么 莫雷事件说什么了
- 吴签是什么意思啊吴亦凡事件 吴签是什么意思
- 腾讯老干妈事件完结 腾讯和老干妈怎么了