标签:
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)。
一、Touch 事件分析
? 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中因为某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。
dispatchTouchEvent 的事件分发逻辑例如以下:
? 事件拦截:public
boolean onInterceptTouchEvent(MotionEvent ev)
在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下。事件会自己主动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑例如以下:
? 事件响应:public boolean onTouchEvent(MotionEvent ev)
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 而且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。
onTouchEvent 的事件响应逻辑例如以下:
通过以下的图能够清楚的看到事件整个传递的过程(布局为viewGroup1在最外层,里面嵌套一个viewGroup2。viewGroup2里面加入了一个Button)。
从下图也能够看出,事件会最先被最外层的布局(viewGroup1)给对应。然后依次向内层(viewGroup2)传递,当传递到最内层的View (Button)。假设View已经是一个最小单元时,那么就会交给View的onTouchEvent处理事件。假设还不消费该事件,那么事件就会向上回传,直到没有人处理这次事件,事件就会丢失。
版权声明:本文博主原创文章,博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4875453.html