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中

总体流程

  1. 事件从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边界内,但是该事件不被处·理,事件分发结束。
  2. 事件传递到ViewGroup后,ViewGroup调用dispatchTouchEvent方法,内部会调用onInterceptTouchEvent()方法,如果onInterceptTouchEvent()方法返回true,说明事件被ViewGroup拦截,事件停止向下传递(ViewGroup调用onTouchEvent()方法、dispatchTouchEvent返回true)如果其onTouchEvent方法返回false,说明事件没有被ViewGroup处理,事件向上传给Activity层进行处理,且无法为ViewGroup注册点击事件。如果其onTouchEvent方法返回true,说明事件被ViewGroup处理,事件分发结束,可以为ViewGroup注册点击事件。如果onInterceptTouchEvent()方法返回false,说明事件未被ViewGroup拦截,事件继续向下传递。
  3. 事件传递到View之后,View调用dispatchTouchEvent方法,内部会调用onTouchEvent方法,如果onTouchEvent()方法返回true,说明当前View处理了当前事件,事件分发结束,可以为View注册点击事件。如果onTouchEvent()方法返回false,说明事件未被View处理,事件向上传递给ViewGroup,且无法为View注册点击事件。
posted @ 2022-03-05 20:42  wx2020  阅读(116)  评论(0编辑  收藏  举报