`

Android View的事件分发机制

阅读更多

阅读《Android开发艺术探索》提炼实践总结

 

所谓事件分发?

     所谓点击事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。

 

点击事件的分发过程有三个很重要的方法来共同完成!

 

dispatchTouchEvent(MotionEvent ev)

用于事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。

 

onInterceptTouchEvent(MotionEvent event)

View没有这个方法,Activity也没有,只有ViewGroup才有

在dispatchTouchEvent方法中调用,用来判断是否拦截摸一个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。

 

onTouchEvent(MotionEvent event)

在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。

 

这三个方法的关系时什么呢?

     我超级喜欢下面的伪代码,将关系道的淋漓尽致

public boolean dispatchTouchEvent(MotionEvent ev) {
  boolean consume = false;
  if (onInterceptTouchEvent(ev)) {
      consume = onTouchEvent(ev);
  } else {
      consume = child.dispatchTouchEvent(ev);
  }
  return consume;
}

 

一些需要注意的小tips:

  1. 传递机制:Activity->Window->View,即事件总时先传递给Activity,Activity在传递给Window,最后Window在传递给顶级View,顶级View接收到事件后,就会按照事件分发机制去分发事件。
  2. 如果所有的元素都不处理这个事件,那么这个事件最后将会传递给Activity,即Activity的onTouchEvent方法会被调用。
  3. ViewGroup默认不拦截任何事件。
  4. View的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable和longClickable同时为false)。View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,TextView的clickable属性默认为false。
  5. View的enable(作用时设置其是否可用)属性不影响onTouchEvent的默认返回值。
  6.  事件传递过程时由外向内的,即事件总是传递给父元素,然后在由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。

 

分享到:
评论

相关推荐

    谈谈对Android View事件分发机制的理解

    在Android开发中,View事件分发机制是理解用户交互与响应的关键部分。本文将深入探讨这一主题,以解决文中遇到的问题:LinearLayout中的TextView和Button点击事件处理不一致。首先,我们要明白Android事件分发机制...

    view的事件分发机制demo2

    在Android开发中,事件分发机制是理解和优化用户交互体验的关键环节。本文将深入探讨"view的事件分发机制demo2",并基于链接提供的详细...因此,深入研究"view的事件分发机制demo2"将对Android开发技能的提升大有裨益。

    android View事件分发机制实验代码

    本源码结合博客地址: https://blog.csdn.net/gaoxiaoweiandy/article/details/89840433 讲述了View的事件分发机制以及如何阅读与分析源码。

    Android View 事件分发机制详解

    Android View 事件分发机制是Android用户界面交互的基础,它决定了触摸事件如何在视图层次结构中传递和处理。在Android开发中,理解和掌握这一机制至关重要,因为它涉及到UI的响应性和用户体验。 首先,事件分发...

    Android View事件分发处理机制Demo

    总的来说,Android的View事件分发机制是一个深度话题,涉及多个组件和方法的协同工作。通过"TestEventFlow"这样的实践项目,开发者能够更直观地理解事件如何在View层次结构中流动,从而更好地设计和优化用户界面的...

    [android][Android点击事件分发机制分析]

    事件分发机制是Android系统处理用户触摸事件的关键流程,理解这一机制对于优化UI交互和处理复杂视图层次结构至关重要。本文将深入探讨Android点击事件的分发过程,包括事件的产生、传递和处理。 首先,当用户在屏幕...

    Android事件分发机制

    在Android系统中,事件分发机制是用户与应用程序交互的核心环节。它决定了用户在屏幕上点击、滑动等操作如何被正确地处理和响应。本文将深入探讨Android事件分发机制,帮助开发者理解这一关键概念。 首先,我们从...

    Android事件分发机制全解析Demo

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在不同的组件之间传递和处理。本文将基于“Android事件分发机制全解析Demo”进行深入探讨,并通过实际的代码示例来帮助你更...

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

    在博客文章“Android自定义View的事件分发机制(一)”中,作者jsonnan详细阐述了这些概念,并可能通过实例代码展示了如何在自定义View中实现自定义的事件分发逻辑。通过阅读这篇文章,开发者可以更深入地理解...

    Android View事件分发机制详解

    ion of this abstract class is `...总的来说,Android事件分发机制是UI交互的基础,理解它可以帮助我们创建更高效、更符合用户预期的界面。在开发过程中,可以通过调试和日志来跟踪事件的传递路径,以优化交互逻辑。

    android事件分发机制Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。...通过实践`android事件分发机制Demo`,你可以直观地看到事件如何在View和ViewGroup之间传递,从而加深对这一机制的理解。

    Android Touch事件分发机制代码一

    本文将深入解析Android的Touch事件分发机制,并通过一个名为"EventDispatchTest"的示例来说明。 1. **事件分发流程** Android中的触摸事件分发分为三个阶段:`dispatchTouchEvent()`, `onInterceptTouchEvent()`, ...

    Android事件分发机制总结Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。本文将深入探讨“Android事件分发机制总结Demo”,结合代码实例MyTouchEventDemo,帮助开发者清晰理解这一核心概念。 事件分发机制主要涉及...

    Android 事件分发机制视频讲解

    ### Android 事件分发机制详解 #### 一、引言 在Android开发中,事件处理是用户界面交互设计的核心组成部分。对于开发者来说,理解事件如何被分发到各个控件中至关重要,因为这直接影响到应用的用户体验。本文将从...

    Android事件分发机制小Demo

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面元素交互时的行为。本小Demo主要展示了Android事件分发的过程,并通过一系列的日志截图来帮助理解这一机制。下面,我们将深入探讨Android...

    android事件分发机制

    ### Android事件分发机制详解 #### 一、触摸事件涉及的核心类 在Android系统中,触摸事件主要由两类核心对象负责处理:`ViewGroup` 和 `View`。 1. **ViewGroup**:作为容器,继承自 `View`,用于容纳多个 `View`...

    android中触摸事件的分发机制

    在Android系统中,触摸事件的处理是通过一个复杂的分发机制来实现的,这个机制确保了用户在屏幕上点击或滑动时,相应的视图能够正确地接收到并响应这些动作。下面将详细介绍Android中触摸事件的分发机制,以及如何在...

Global site tag (gtag.js) - Google Analytics