Android 事件分发机制
前言
事件分发的对象是点击事件。
事件分发的类型
事件共有四种类型:
- MotionEvent.ACTION_DOWN:按下View
- MotionEvent.ACTION_UP:抬起View
- MotionEvent.ACTION_MOVE:滑动View
- MotionEvent.ACTION_CANCEL:事件意外结束
事件传递的途径
事件在Activity、ViewGroup、View中传递,先传到Activity再传到ViewGroup最后传到ViewGroup是一组View的集合,是View的子类,但也是一个View。
相关方法
- dispatchTouchEvent() 进行事件分发
- onTouchEvent() 处理事件 在dispatchTouchEvent()内部调用
- onInterceptTouchEvent() 判断是否拦截了某个事件,只存在于ViewGroup中
总体流程
- 事件从Activity发生后,Activity判断dispatchTouchEvent方法的返回值,默认情况下该方法内部直接调用ViewGroup的dispatchTouchEvent方法(下一层),如果该方法返回true说明事件在ViewGroup层被消费,事件分发结束(Activity的dispatchTouchEvent返回true);如果该方法返回false说明ViewGroup层没有消费此事件,需要Activity层进行处理(Activity调用onTouchEvent()、dispatchTouchEvent返回false)。如果Activity. onTouchEvent()返回true说明事件在Activity的Windows边界外,事件不会被Activity下的任意组件处理,事件分发结束。如果Activity. onTouchEvent()返回false说明事件在Activity的Window边界内,但是该事件不被处·理,事件分发结束。
- 事件传递到ViewGroup后,ViewGroup调用dispatchTouchEvent方法,内部会调用onInterceptTouchEvent()方法,如果onInterceptTouchEvent()方法返回true,说明事件被ViewGroup拦截,事件停止向下传递(ViewGroup调用onTouchEvent()方法、dispatchTouchEvent返回true)如果其onTouchEvent方法返回false,说明事件没有被ViewGroup处理,事件向上传给Activity层进行处理,且无法为ViewGroup注册点击事件。如果其onTouchEvent方法返回true,说明事件被ViewGroup处理,事件分发结束,可以为ViewGroup注册点击事件。如果onInterceptTouchEvent()方法返回false,说明事件未被ViewGroup拦截,事件继续向下传递。
- 事件传递到View之后,View调用dispatchTouchEvent方法,内部会调用onTouchEvent方法,如果onTouchEvent()方法返回true,说明当前View处理了当前事件,事件分发结束,可以为View注册点击事件。如果onTouchEvent()方法返回false,说明事件未被View处理,事件向上传递给ViewGroup,且无法为View注册点击事件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步