`
xixinfei
  • 浏览: 414059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android-view事件传递机制

 
阅读更多

AndroiddispatchTouchEvent,onInterceptTouchEvent, onTouchEvent的理解

 

http://blog.csdn.net/chenzhiqin20/article/details/8816364

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

 

android的事件处理分为3步。

 

1)public booleandispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

 

假设当前Activity 布局如下:

 

 

dispatchTouchEvent事件分发

 

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent 。然后由  dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 onInterceptTouchEvent方法来决定是否要拦截这个事件,

 

如果onInterceptTouchEvent返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果onInterceptTouchEvent返回 false ,那么就传递给子 view,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。

 

 如图:

 

 

 

事件拦截:onInterceptTouchEvent

 

 onInterceptTouchEvent用于改变事件的传递方向。决定传递方向的是返回值,返回为false时事件会传递给子控件,返回值为true时事件会传递给当前控件的onTouchEvent(),这就是所谓的Intercept(拦截)。

 

[tisa ps:正确的使用方法是,在此方法内仅判断事件是否需要拦截,然后返回。即便需要拦截也应该直接返回true,然后由onTouchEvent方法进行处理。]

 

onTouchEvent用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。尤其对于ACTION_DOWN事件,返回 true,表示我想要处理后续事件(ACTION_MOVE或者ACTION_UP);返回false,表示不关心此事件,并返回由父类进行处理。 

 

在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false), 对上面这个布局,MotionEvent事件的传递顺序如下:

 

 

 

当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:

 

 

 

 如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么 LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给 LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程 变成(图中没有画出ACTION_CANCEL事件):

 

 

小总结:onInterceptTouchEvent是自rootiew向下传递, onTouchEvent正好相反。

分享到:
评论

相关推荐

    Android Touch事件传递机制解析

    在Android系统中,触摸事件是用户与应用交互的重要方式,理解其事件传递机制对于优化UI交互和处理复杂触摸逻辑至关重要。本文将深入解析Android的Touch事件传递机制,并结合源码进行详细阐述。 首先,Android的触摸...

    View事件传递机制Demo源码

    事件传递机制遵循"事件冒泡"(Event Bubbling)原理,即事件首先被最底层的View接收,然后逐级向上层父View传递,直到被某个View消费或传递至根视图。 1. 事件处理流程: - ACTION_DOWN:当手指首次接触屏幕时,...

    Android事件传递机制

    当用户触摸屏幕时,系统会产生一系列的MotionEvent对象,并通过事件传递机制将其分发给相应的View。 事件传递机制遵循“父子组件”模型,可以分为三个主要阶段:捕获阶段、目标阶段和消耗阶段。 1. 捕获阶段:事件...

    《Android高级进阶》 第一章 Android 触摸事件传递机制 @DEMO View的事件传递机制

    以后会按标准一个个的写完测试DEMO,一是自我学习,二是方便同样在学习的其他同学这是,本系列代码均来自《Android高级进阶》,经过测试可以运行,这是 第一章 Android 触摸事件传递机制 View的事件传递机制

    android Touch事件传递机制

    在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...

    事件传递机制Demo

    在Android开发中,事件传递机制是用户界面交互的核心部分,它决定了用户在屏幕上触摸或点击时,事件如何在各个View之间进行分发。本Demo,"事件传递机制Demo",着重展示了这一机制的工作原理和常见应用场景。我们...

    事件传递机制和原理

    在Android开发过程中,理解事件传递机制对于实现高效的用户交互界面至关重要。本篇文章基于一个关于“事件传递机制和原理”的流程图进行深入解析,旨在帮助开发者更好地掌握事件传递的核心概念与流程。 #### 一、...

    028-Android事件响应机制

    4. 触摸事件的拦截:除了默认的事件传递机制,还可以通过ViewGroup的onInterceptTouchEvent()方法实现事件拦截。当ViewGroup的onInterceptTouchEvent()返回true时,事件会被拦截并交给当前ViewGroup处理,不再向下...

    android事件传递机制

    在Android系统中,事件传递机制是用户界面交互的基础,它涉及到Activity、View、 ViewGroup等组件之间的协同工作。本文将深入探讨这一机制,帮助你理解如何在Android应用中处理触摸事件。 1. 触摸事件的起源 触摸...

    Android onTouch事件传递机制

    本篇文章将深入探讨Android的`onTouch`事件传递机制,帮助开发者更好地理解和运用这一功能。 首先,Android的触摸事件主要由三个基本事件构成:`ACTION_DOWN`、`ACTION_UP`和`ACTION_MOVE`。`ACTION_DOWN`表示手指...

    view的事件传递机制与滑动冲突

    在Android开发中,View的事件传递机制是理解用户交互与响应设计的关键部分。滑动冲突则是移动应用中常见的问题,特别是在处理多个可滑动组件时。这篇博客将深入探讨这两个主题,并提供解决滑动冲突的有效策略。 ...

    Android-传统事件捕获和冒泡的流程解析

    事件在Android中主要通过View和 ViewGroup对象进行传递。当用户在屏幕上触摸或点击时,系统会生成一个事件对象,如MotionEvent,然后将该事件沿着视图层次结构进行传递。这个过程可以分为两个阶段:事件捕获...

    Android自定义View的事件分发机制(一)

    事件分发是Android UI交互的核心机制,它决定了触摸事件如何在View层次结构中传递。本文将深入探讨自定义View的事件分发机制。 事件分发在Android中分为三个主要步骤:`dispatchTouchEvent()`, `...

    Android TouchEvent事件传递机制

    本篇将深入解析Android的TouchEvent事件传递机制,帮助开发者更好地理解和利用这一机制。 首先,当用户触摸屏幕时,硬件层会生成一个MotionEvent,该事件包含了触摸事件的类型(ACTION_DOWN、ACTION_UP、ACTION_...

    android 事件传递机制dome

    在Android开发中,事件传递机制是一个非常重要的概念,它涉及到用户与应用界面的交互。标题“android 事件传递机制dome”表明我们将深入探讨这一机制,并通过实例(dome,通常指的是示例代码)来理解其工作原理。...

    Android事件传递机制Demo.zip

    1. **事件流**:Android事件传递机制遵循"事件流",即事件首先会传递到View树的最顶层,也就是Window,然后向下逐级分发。事件流包括三个阶段:Down(触摸按下)、Move(移动)和Up(触摸释放)。 2. **事件分发**...

    android view事件传递分析

    本文将深入探讨Android View事件传递机制。 首先,我们从基础开始,Android事件传递主要涉及三个对象:事件(Event)、视图(View)和事件分发链(Event Dispatch Chain)。事件通常由用户的触摸输入触发,如按下、...

    Android View事件分发处理机制Demo

    如果事件被处理,则返回true,否则返回false,表示事件未被消耗,可以继续向子View传递。 2. **onTouchEvent()**: `onTouchEvent()`是直接处理触摸事件的方法,它在View中被调用。如果一个View希望接收并处理触摸...

Global site tag (gtag.js) - Google Analytics