android的事件分发机制应该是使用最常见的,但是也是比较乱的部分了,只要是和用户交互的部分都是涉及事件分发机制的。
主要涉及的方法:
dispatchTouchEvent():分发
onTouchEvent:处理事件
onInterceptTouchEvent:拦截事件
View只有dispatchTouchEvent、onTouchEvent两个方法
ViewGroup有dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法
Activity只有dispatchTouchEvent、onTouchEvent两个方法
事件类型都是定义在MotionEvent中:
ACTION_DOWN:按下,down事件肯定会全部传递下去,没法拦截,长按事件是在down中出现的,长按超过500ms的时候就是长按事件了
ACTION_UP:抬起
ACTION_MOVE:移动
ACTION_CANCEL:滑动从控件滑到控件外面
ACTION_OUTSIDE:必须先设置接收外面点击事件flag,才能接收该事件,比如dialog
ACTION_POINTER_DOWN:多点触控,按下
ACTION_POINTER_UP:多点触控,抬起
获取事件类型的方法:
getAction():包含pointer的事件index和事件类型
getActionMask():仅包含事件类型
整体分发事件图: