`

Android Activity 和 ViewGroup中事件触发和传递机制

阅读更多

1.在只有Activity的情况:

1)Touch事件触发流程:

复制代码
   首先触发dispatchTouchEvent

   然后触发onUserInteraction

   再次onTouchEvent

   如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up)

   触发dispatchTouchEvent

   再次onTouchEvent

   当ACTION_up事件时不会触发onUserInteraction(可查看源代码)
复制代码

2)键盘事件触发流程:

复制代码
 首先触发dispatchKeyEvent

 然后触发onUserInteraction

 再次onKeyDown

 如果按下紧接着松开,则是俩步

 紧跟着触发dispatchKeyEvent

 然后触发onUserInteraction

 再次onKeyUp

 注意与触摸不同,当松开按键时onUserInteraction也会触发。
复制代码

 总之:  Activity.dispatchTouchEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。(同理 dispatchKeyEvent)

2.Activity里有一个Layout,在Layout里有个按钮情况:

如果在按钮上触发一个CLICK事件,那么事件传递流程:

 

复制代码
首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch(这是一个ACTION_DOWN事件)

紧跟着是一个ACTION_UP事件

触发ACTIVITY的dispatchTouchEvent

注意不再触发ACTIVITY的onUserInteraction,因为他对ACTION_UP不起作用。

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch

最后触发BUTTON的onClick.

如果你在ONTOUCH事件里返回true,消费了此事件,那么ONCLICK将不会被响应

但是如果你不写ONCLICK事件,而ONTOUCH事件返回FLASE
复制代码

 

以上摘录:http://blog.csdn.net/G_rrrr/article/details/4861189  

 

3.总结:

Android事件触发流程:

-------------------------------------------------------------------

首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

-------------------------------------------------------------------

查看:http://hi.baidu.com/lck0502/blog/item/7eeb452a846ff196023bf654.html

=================================================================================================================

在ViewGroup(即上面Layout)情况特别分析:

针对由于触摸(Touch)而触发的事件。

Android的事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN, 表示按下了屏幕。之后,touch将会有后续事件,可能是:

  • ACTION_MOVE //表示为移动手势

  • ACTION_UP //表示为离开屏幕

  • ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序产生的

一个Action_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。

在Android中,有一类控件是中还可以包含其他的子控件,这类控件是继承于ViewGroup类,例如:ListView, Gallery, GridView。

还有一类控件是不能再包含子控件,例如:TextView。

本文的主要讨论对象就是ViewGroup类的控件嵌套时事件触发情况。

对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View继续传递,这个方法是从父View向子View传递

而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。

Touch事件在 onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去(只是传递方向不一样,onInterceptTouchEvent()向子View传,而onTouchEvent()向父View传)

具体情况如下:

ACTION_DOWN事件会传到某个ViewGroup类的onInterceptTouchEvent,如果返回false,则DOWN事件继续向子ViewGroup类的onInterceptTouchEvent传递,如果子View不是ViewGroup类的控件,则传递给它的onTouchEvent。

如果onInterceptTouchEvent返回了true,则DOWN事件传递给它的onTouchEvent,不再继续传递,并且之后的后续事件也都传递给它的onTouchEvent。

如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent继续处理。(后续事件只会传递给对于必要事件ACTION_DOWN返回了true的onTouchEvent)

总结一下就是:onInterceptTouchEvent可以接受到所有的Touch事件,而onTouchEvent则不一定

分享到:
评论

相关推荐

    Android Touch事件传递机制解析

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

    android之Touch事件处理机制测试

    本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...

    事件传递机制和原理

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

    Activity点击穿透效果

    2. 修改根布局属性:在布局文件中,为Activity的根布局设置 `android:clickable="true"` 和 `android:focusable="true"`,然后在Java代码中重写 `onTouchEvent` 方法,对不需要处理的事件返回 false。 ```xml ...

    Android事件传递机制Demo.zip

    在Android开发中,事件传递和事件分发是关键的概念,特别是在UI交互中。这个"Android事件传递机制Demo.zip"文件包含了一个名为"TouchEventDemo"的示例,它旨在帮助开发者理解这一过程。以下是对Android事件传递机制...

    android事件传递机制

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

    Android事件分发机制(上) ViewGroup的事件分发

    在Android系统中,事件分发机制是用户交互的基础,它涉及到UI组件的View和ViewGroup。本文主要讨论ViewGroup的事件分发,包括MotionEvent的种类、事件分发的重要方法以及事件分发流程。 首先,MotionEvent是Android...

    Android中Touch事件的传递

    总结来说,Android中的Touch事件传递涉及到了Activity的布局加载、DecorView和ViewGroup的事件分发机制以及事件拦截。通过理解这些机制,开发者可以编写出更加合理和高效的事件处理代码,以优化用户界面的响应性和...

    Android TouchEvent事件传递

    在Android开发中,触摸事件(TouchEvent)是用户与设备交互的主要方式之一,它涉及到Activity、View及ViewGroup之间的事件分发。理解Android TouchEvent事件传递机制对于构建具有良好用户体验的应用至关重要。本文将...

    Android中的View与ViewGroup绘制过程,手势监听顺序与使用

    总之,理解Android中的View和ViewGroup的绘制流程,以及手势监听机制,对于提升UI开发的效率和质量至关重要。通过实践和调试,开发者可以更好地控制UI的呈现和交互,实现更加灵活和丰富的用户界面。

    Android Touch事件分发机制代码一

    在Android系统中,触摸事件的分发是UI交互的核心部分,它涉及到Activity、ViewGroup和View之间的协同工作。本文将深入解析Android的Touch事件分发机制,并通过一个名为"EventDispatchTest"的示例来说明。 1. **事件...

    Android TouchEvent事件传递机制

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

    Android-Android实现了可以滑动左侧边缘退出Activity的功能

    在Android中,布局通常由多个View和ViewGroup组成,而Activity则包含一个顶级的DecorView。为了实现滑动退出,我们可以在Activity的根布局上添加一个全屏的透明View(例如使用`FrameLayout`或`RelativeLayout`),这...

    Android事件分发机制

    事件分发涉及到Activity、ViewGroup和View三个层次,确保触摸事件能够准确地传递到目标视图进行处理。下面将详细阐述Android事件分发机制的工作原理。 1. **事件序列**: - 触摸事件首先由系统产生,通常是用户对...

    android Touch触发事件的生命周期

    本篇将深入解析“android Touch触发事件的生命周期”,着重讨论ViewGroup中点击事件的`dispatchTouchEvent()`, `onInterceptTouchEvent()`, 和`onTouchEvent()`这三个关键方法之间的关系及其工作流程。 首先,我们...

    Android从源码的角度彻底理解事件分发机制的解析(上)

    Android事件分发机制是Android UI开发中的核心部分,它决定了用户交互事件如何在View和ViewGroup之间传递和处理。本文将从源码角度深入解析这一机制,帮助开发者更全面地理解其工作原理。 首先,我们需要了解事件...

    Android中父View和子view的点击事件

    本文将深入探讨Android中父View( ViewGroup)与子View的点击事件处理机制,以及如何在实际应用中进行有效管理。 一、点击事件的基础知识 在Android中,点击事件是由MotionEvent类来表示的,主要包括ACTION_DOWN、...

    AndroidView的事件分发机制和滑动冲突解决方案.docx

    ### AndroidView的事件分发机制和滑动冲突解决方案 #### 一、View的事件分发机制 在Android中,理解View的事件分发机制是非常重要的,因为它直接关系到用户交互的响应逻辑。本文将首先介绍Android中View的事件分发...

    Android深入研究Touch事件demo

    在Android开发中,触摸事件(Touch Event)是用户与设备交互的重要部分,它涉及到Activity、View及ViewGroup之间复杂的事件分发机制。本篇将深入探讨Android中的触摸事件处理,包括事件的产生、分发、拦截以及如何...

Global site tag (gtag.js) - Google Analytics