事件传递之一(基本概念)

Android事件传递机制之一

所谓事件传递是指在Android应用程序开发中,当有多个View叠加在同一个区域内,如果按下View所在的区域,按下的Down、Move,Up事件将如何进行传递的过程。

假设一个ViewGroup里面包含了一个View,当用户按下View时,ViewGroup和View有哪些方法会触发呢。

在了了解这些事件传递之前,我们先来了解一下几个方法的概念:

1. dispatchTouchEvent:此方法只有继承ViewGroup的类才有,是指向childView分发事件的函数,即当手按下了View(或者ViewGroup)的位置,都会通过ViewGroup的dispatchTouchEvent事件,也就是它是所有View事件获取到之前触发,所有childView的事件都是通过dispatchTouchevent分发的。

2. onInterceptTouchEvent:此方法只有继承ViewGroup的类才有,在dipatchTouchEvent分发后,就会被onInterceptTouchEvent所捕获,此方法起到一个拦截事件的作用,

如果此方法return true,则表示不会再继续处理后续的事件。例如当onInterecptTouchEvent的Down的时候返回了true,则事件将不会继续传递给子View的onTouchEvent了,

而是将事件传给当前ViewGroup的onTouchEvent进行处理

3.onTouchEvent:: 此方法不论是ViewGroup,还是View都有此都有,因为不论是ViewGroup还是View都是View的子类,所以onTouchEvent是View的函数。

以下举一个具体的实例来,描述事件传递过程

假设一个LinearLayout里面包含了一个TextView,当用户点击TextView中,事件将是如何传递的(为了描述方便,分别使用L1,T1)

1.如果默认情况下按如下顺序传递事件

L1的dispatchTouchEvent的Down  -> L1的onInterecptTouchEvent的Down  ->T1的onTouchEvent的Down,默认情况下都是这个传递顺序

  1. 假如 T1的onTouchEvent的Down  return false了,则事件到此消失,不再继续传递下去
  2. 假如T1的onTouchEvent的Down  return true 了, 则事件将会被传递到L1的onTouchEvent中,于是事件便有了如下流程
  3. L1的dispatchTouchEvent的Down  -> L1的onInterecptTouchEvent的Down  ->T1的onTouchEvent的Down  ->L1的onTouchEvent的Down

2.于是我们可以得出如下结论

  1. 如果child view的onTouchEvent返回true,则Down事件将不再继续往下传递,如果child view的onTouchEvent返回的是false,则Down继续传递给childview 的parent的onTouchEvent
  2. Up事件不会走Down事件的onTouchEvent传递过程,谁处理了OnTouchEvent的Down事件并且返回了true(则事件不再继续传递下去),谁就处理Up事件,所以如果Down事件传递到了最顶级的Parentview,而最顶级的Parent view的onTouchEvent返回了false,则程序将丢失Up事件。
时间: 2024-08-04 10:07:22

事件传递之一(基本概念)的相关文章

强强学Android_Android事件传递

学习资料 : 疯狂Android讲义_Android事件处理 学习笔记 如有错误之处请大家帮忙指出纠正__谢谢 ------------------------------------------------------------------------------------------------------------------------------------------- Android事件处理概念 : 当用户在程序应用界面上执行各种操作时,应用程序必须为用户提供响应动作,这种响

Android中事件传递机制的总结

事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处理的 自定义view的时候,事件也冲突了怎么解决 带着这三个疑问,我们来总结一下事件传递机制是怎么回事. 一.事件分发的原理: 1.事件是如何传递的: (1)首先由Activity分发,分发给根View,也就是DecorView(DecorView为整个Window界面的最顶层View) (2)然后

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 4. 事件代理3 5. 冒泡还是捕获?3 6. Js 冒泡事件阻止3 6.1. 返回false5 7. 事件冒泡 使处理函数有范围较大的触发面积,在“拖拽效果”脚本中是必须的5 8. refe6 8.1.1. 浅谈事件冒泡与事件捕获 - ac黄博客精选 - SegmentFault6   1. 事

深入理解 View 的事件传递机制

引言:现在 GitHub 上酷炫的 Android 控件越来越多,一方面我们可以让 App 各美观,另一方面我们这些开发者也可以从中学习到各种知识.写下这篇博文主要是记录研究自定义控件源码过程中接触到的知识盲区,帮助自己巩固知识的同时,也和大家交流学习,一起进步. Demo源码 废话不多说,进入正题: 一.概述 View 事件传递机制 用户通过点击.滑动屏幕与 App 产生交互是移动互联网时代的交互基础,那么在 Android 中,用户的点击.滑动是怎么和 Android 系统产生交互的呢? 在

菜鸟进阶之Android Touch事件传递(二)

这是touch事件传递系列博客的第二篇,如果想了解touch和click的那些事,请浏览投产事件传递系列的第一篇.http://blog.csdn.net/bingospunky/article/details/43603397 理理思路,我发现touch传递这部分的内容很多,所以每篇博客介绍一个方面比较好.这篇博客主要介绍touch事件传递的现象,一个简单的demo,让大家可以看到touch一步一步传递的过程.下篇博客中在研究源码是怎么实现的.再后面的博客会试图改变这篇文章看到的touch的传

OGEngine学习笔记--- 事件传递

事件传递 Android中的事件在表现形式上有很多,如onTouch.onClick和onLongClick等,在具体微观上的表现形势有action_down.action_move和action_up等. 无论哪种事件表现类型,首先都是基于事件的传递模型.其实Android中的事件传递有点类似于JS中事件传递模型.都是基于先捕获然后冒泡的形式. 在OGEngine的API中,OGEngine负责捕获触摸事件,如果我们需要监听触摸事件,则需要向Scene注册. mScene.registerTo

【转】QT事件传递与事件过滤器

1.事件类型 Qt程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发. Qt事件的类型很多,常见的qt的事件如下:            键盘事件: 按键按下和松开.        鼠标事件: 鼠标移动,鼠标按键的按下和松开.        拖放事件: 用鼠标进行拖放.        滚轮事件: 鼠标滚轮滚动.        绘屏事件: 重绘屏幕的某些部分.        定时事件: 定时器到时.        焦点事件: 键盘焦点移动.        进入和离开事件: 鼠标移入widge

ViewGroup 和 View 事件传递及处理小谈

前言 在自定义组件的时候少不了会去处理一些事件相关的东西,关于事件这块网上有很多文章,有说的对的也有说的不对的,我在理解的时候也有过一段时间的迷惑,现在把自己理解的东西写下来,给有相同疑问的朋友提供些思路.    事件呢,分为两个大的链条,一个是事件分发链条,一个是事件处理链条.分发链条是由外至内,也就是从父到子,父节点先收到并有权决定是否继续分发:而事件处理链条则是由内至外,即先由最内部的子节点处理事件,子节点有权决定是由自己来处理事件,还是抛给父节点. 概念解释 onTouchEvent  

Android 源码分析(十一) 事件传递机制

一.介绍 Android三种事件类型:ACTION_DOWN,ACTOIN_MOVE,ACTION_UP. 事件传递的三个阶段: 分发(Dispatch) 方法:public boolean dispatchTouchEvent(MotionEvent ev) 拦截(Intercept) 方法:public boolean onInterceptTouchEvent(MotionEvent ev) 消费(Consume) 方法:public boolean onTouchEvent(Motion