Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent
父到子传递dispatch -》 intercept -》 ontouch,如果不处理,子到父回传,ontouch处理
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。方法与控件的对应关系如下表所示:
从 这张表中我们可以看到 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 的事件分发逻辑如下:
如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
在 外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:
如 果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件。
如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
到这里,与 Touch 事件相关的三个方法就分析完毕了。下面的内容会通过各种不同的的测试案例来验证上文中三个方法对事件的处理逻辑。
- 大小: 42.5 KB
分享到:
相关推荐
"EventDispatchTest"可能是用于测试事件分发的一个小程序。它可能创建了一个包含多个子View的布局,并在Activity、ViewGroup和View中重写了上述的触摸事件方法,以显示每个阶段的状态。例如,每个方法内打印日志,...
本Demo主要展示了Android的Touch事件分发机制,包括事件的传递顺序、处理流程以及如何自定义控件来拦截或消费事件。下面将详细解析这些知识点。 1. **事件流**: Android的Touch事件流分为三个阶段:**ACTION_DOWN...
本文将深入探讨Android触摸事件的分发流程,帮助开发者更好地理解和利用这一核心功能。 触摸事件主要由三类动作组成:ACTION_DOWN(手指按下),ACTION_MOVE(手指移动)和ACTION_UP(手指抬起)。当用户在屏幕上...
事件分发应用则表明这个组件着重处理触摸事件的传递和处理流程,即如何在父视图和子视图之间正确地分发ACTION_DOWN、ACTION_MOVE、ACTION_UP等触摸事件。 在Android中,ViewPager是一个用于展示可滑动页面的控件,...
【Touch事件分发】在Android系统中,触摸事件(Touch事件)是用户与屏幕交互的主要方式,涉及到Activity、View和ViewGroup之间的事件传递。本文将深入解析Android中的触摸事件分发机制,帮助开发者理解并更好地处理...
本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...
当用户在屏幕上进行操作时,这些事件会经过一系列的处理和分发,最终到达相应的View进行响应。在这个过程中,涉及到的关键组件包括View、 ViewGroup以及它们的onTouchEvent()方法。以下是对Android事件分发机制的...
在Android系统中,事件分发机制是用户与应用程序交互的核心环节,主要处理各种触摸事件(如点击、滑动等)。事件分发涉及到Activity、ViewGroup和View三个层次,确保触摸事件能够准确地传递到目标视图进行处理。下面...
在Android系统中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及到了UI控件的响应和处理。本文将深入解析Android的Touch事件传递机制,帮助开发者理解这一核心概念。 首先,我们了解下Android中的...
5. **事件分发流程**: - ACTION_DOWN:事件首先传递到最顶层的View,即DecorView,然后传递到根ViewGroup。 - 如果ViewGroup没有拦截事件(onInterceptTouchEvent()返回false),事件会进入子View的onTouchEvent...
为了深入理解Android触摸事件的处理流程,我们可以通过查看源码来进行更详细的解析。 1. **触摸事件的第一入口**:触摸事件首先被Activity的顶层 `ViewGroup` 接收,即 `dispatchTouchEvent` 方法。 ```java ...
事件分发机制是Android系统处理用户触摸事件的关键流程,理解这一机制对于优化UI交互和处理复杂视图层次结构至关重要。本文将深入探讨Android点击事件的分发过程,包括事件的产生、传递和处理。 首先,当用户在屏幕...
整个Touch事件的处理流程可以用流程图来概括。首先,PhoneWindow的DecorView会调用dispatchTouchEvent方法来分发事件。然后,事件会向上传递至PhoneWindow的superDispatchTouchEvent,随后是DecorView的...
Android Touch事件分发是Android用户界面交互的核心机制之一,它确保了用户在触摸屏幕时,事件能够正确地被相应的View处理。深入理解这一机制对于优化用户体验和开发复杂的交互功能至关重要。 1. 触摸动作及事件...
本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解这一核心概念。 ### 一、事件产生 当用户在屏幕上触摸时,硬件层会生成原始的触控事件(MotionEvent),...
通过查看源代码,我们可以更直观地理解Android触摸事件的分发和处理流程。 总的来说,理解并熟练掌握Android的触摸事件处理机制,对于开发出更加流畅、交互性强的应用至关重要。通过实践和调试,我们可以更好地掌控...
在Android系统中,事件分发是用户界面交互的核心机制,主要涉及触摸事件的处理。本文将深入探讨Android事件分发的源码分析,帮助开发者理解这一关键过程。 首先,我们从一个触摸事件的发生开始。当用户在屏幕上点击...
总结来说,"android测试Touch事件DEMO"是一个用于教学和实践的实例,它涵盖了Android中触摸事件的基本处理、事件分发以及自定义日志记录,对于理解和掌握Android触摸事件机制非常有帮助。通过这个DEMO,开发者可以...