Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);可以响应这些方法的控件包括:ViewGroup、View、Activity。方法与控件的对应关系以下表所示:
测试
Touch 事件相关方法 | 方法功能 |
ViewGroup |
View |
Activity |
public boolean dispatchTouchEvent(MotionEvent ev) | 事件分发 |
Yes | Yes | Yes |
public boolean onInterceptTouchEvent(MotionEvent ev) |
事件拦截 |
Yes | Yes | No |
public boolean onTouchEvent(MotionEvent ev) | 事件响应 |
Yes | Yes | Yes |
从这张表中咱们能够看到 ViewGroup 和 View 对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。另外须要注意的是 View 对 dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev) 的响应的前提是能够向该 View 中添加子 View,若是当前的 View 已是一个最小的单元 View(好比 TextView),那么就没法向这个最小 View 中添加子 View,也就没法向子 View 进行事件的分发和拦截,因此它没有dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev),只有 onTouchEvent(MotionEvent ev)。 spa
1、Touch 事件分析 事件
▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev) it
Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中因为某一条件中止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑以下: io
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
table
在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 状况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑以下: 方法
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev) margin
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 而且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的状况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑以下: tab
到这里,与 Touch 事件相关的三个方法就分析完毕了。下面的内容会经过各类不一样的的测试案例来验证上文中三个方法对事件的处理逻辑。 di