Android之事件分发机制
Android下Touch事件分发和消费事件
前言
Android中与touch事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)
、onInterceptTouchEvent(MotionEvent ev)
、onTouchEvent(MotionEvent ev)
;能够
响应的空间包括:ViewGroup、View、Activity。方法与控件的对应关系如下表所示:
Touch事件相关方法 | 方法功能 | View | ViewGroup | Activity |
---|---|---|---|---|
public boolean dispatchTouchEvent(MotionEvent ev) | 事件分发 | YES | YES | YES |
public boolean onInterceptTouchEvent(MotionEvent ev) | 事件拦截 | NO | YES | NO |
public boolean onTouchEvent(MotionEvent ev) | 事件响应 | YES | YES | YES |
从这张表中可以看出ViewGroup对与Touch事件相关的三个方法均能响应,而Activity和View对于onInterceptTouchEvent(MotionEvent ev)也就是事件拦截不进行响应。`另外需要注意的是View对dispatchTouchEvent(MotionEvent ev)响应的前提是可以向该View中添加子View,如果当前的View已经是一个最小单元View(比如TextView),那么无法向这个最小View中添加子View,也就无法向子 View 进行事件的分发和拦截,所以它没有 dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev),只有 onTouchEvent(MotionEvent ev)。
Touch事件分析
事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
Touch事件发生时Activity的dispatchTouchEvent(MotionEvent ev)方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层View的dispatchTouchEvent(MotionEvent ev)