View的onFilterTouchEventForSecurity方法 如果被其他窗口遮挡,该方法返回false,表示需要过滤触摸事件,就会跳过dispatchTouchEvent方法中的if...onInterceptTouchEvent方法 该方法是ViewGroup中特有的方法,用于表示是否拦截触摸事件。...当我们在父ViewGroup重写该方法返回为true执行事件拦截的逻辑的时候,可以在子View中通过调用requestDisallowInterceptTouchEvent方法,重新设置父ViewGroup...如点击的地方有两个子View都包含点击事件的坐标,那么后被添加到布局中的那个子view会先响应事件,即点击的时候最上层的那个组件先去响应该事件。...Android事件分发机制简图 如果子View之前在处理某个事件,但是后续被ViewGroup拦截,那么子View会接收到ACTION_CANCEL。
我就遇到过这样的时候,当时我很想有一篇文章能简单地解释触摸事件是怎样在视图层次(view hierarchy)中传播的,从而可以将之作为进一步深入学习的起点。...当我们说到“手势剩余部分”时指的是手势后续的MOVE事件和最后的UP或CANCEL事件。 在这里我也不考虑多点触摸手势(我们只假设用一个手指)并且忽略多个MOVE事件可以被归为一组这一实际情况。...我们将要讨论的视图层次是这样的:最外层是一个ViewGroup A,包含一个或多个子view(children),其中一个子view是ViewGroup B,ViewGroupB中又包含一个或多个子view...在刚才的“处理事件”部分中,我们遗漏了这一过程,现在,让我们把它加上: DOWN事件被传给A的onInterceptTouchEvent,该方法返回false,表示它不想拦截。...假如DOWN事件传给C的onTouchEvent方法时,它返回了false,DOWN事件会继续向上传递给B和A的onTouchEvent,即使它们在onInterceptTouchEvent方法中说它们不想拦截这个
参数 event 发送的key事件 返回值 事件被处理返回true,否则返回false。...参数 event 需要执行key的事件 返回值 事件被处理返回true,否则返回false。...Down事件或者由视图组的一个子视图处理,或者被用户自己的onTouchEvent()方法处理;此处理意味你应该执行onTouchEvent()时返回true,这样才能继续看到剩下的手势(取代找一个父视图处理...如果onTouchEvent()返回true时,你不会收到onInterceptTouchEvent()的任何事件并且所有对触摸的处理必须在onTouchEvent()中发生。 3....子视图必须有MarginLayoutParams。比较复杂的工作是在getChildMeasureSpec中完成的。
在非触摸屏设备中接收事件和处理响应的控件是具有焦点(Focused)的控件。一个窗口中一个时间内只能有一个具有焦点的控件。...在早期具有滚轮设备的android系统中以及现在的智能TV电视应用中视图的焦点控制就非常重要了。...下面是几个关于焦点特性的描述: ViewGroup中有一个mFocued成员来保存子视图中哪个子视图是具有焦点的视图,并且这样一直会递归下去。...比如某个视图层次下的根视图ROOT下有A,B,C三个子视图,而B下面又有B1,B2,B3三个子视图,而这时候B3是具有焦点的子视图,那么在B中的mFocued保存的是B3,而ROOT下的mFocued保存的是...视图树加载时的焦点视图的遍历 在窗口里的视图第一次被装载时系统会调用ViewRoot的doTraversal,这个函数内部会调用根视图的requestFocus方法: if (!
然后各自经历measure、layout、draw三个流程最终显示在用户面前,用户在点击屏幕时,点击事件随着Activity传入Window,最终由ViewGroup/View进行分发处理。...(只有在自定义ViewGroup中才用到),这个坐标是相对于当前视图的父视图而言的。...view自身有一些建议权,决定权在 父view手中。 调用场景:在view需要给其孩子设置尺寸和位置时被调用。...传递),false不拦截,如果自定义viewgroup里某个子view需要自己处理事件,就需要重写改方法,让他返回false。...见下: ---- ontouch触摸事件也可以交给其他工具类去实现 1.GestureDetector(手势识别器)去处理,可以在onFling里处理快速滑动事件,同时在MotionEvent.ACTION_UP
在 Android 系统中,触摸事件的分发和处理是一个非常重要的部分。了解触摸事件的分发机制对于我们进行界面交互设计和优化具有重要意义。...这两种方式共同构成了 Android 事件传递的完整过程,用于处理 Touch 事件在视图层次结构中的传递和消费。...同时,这种机制也有助于提高事件处理的效率,因为在事件被拦截或消费后,事件将不再继续传递或回传,从而减少了不必要的计算开销。 3.2 时序图 时序图描述了 Touch 事件在视图层次结构中的传递过程。...在实际应用中,开发者可以根据需要重写这些方法,实现自定义的事件传递和处理逻辑。...四、ViewGroup 中的 dispatchTouchEvent 实现 在 Android 系统中,ViewGroup 对 dispatchTouchEvent 方法进行了重载,以实现更复杂的事件分发逻辑
3 Android 5.1.1(API 22) ViewGroup触摸屏事件传递源码分析 通过上面例子的打印我们可以确定分析源码的顺序,那就开始分析呗。...;假如点击的地方有两个子View都包含的点击的坐标,那么后被添加到布局中的那个子view会先响应事件;这样其实也是符合人的思维方式的,因为后被添加的子view会浮在上层,所以我们去点击的时候一般都会希望点击最上层的那个组件先去响应事件...,进一步决定了ViewGroup是否处理Touch事件,这一点在160行开始的代码中有体现。...那我们分情况继续分析一下: 当161行if判断的mFirstTouchTarget为null时,也就是说Touch事件未被消费,即没有找到能够消费touch事件的子组件或Touch事件被拦截了,则调用ViewGroup...关于他们的事件是哪派发来的可以继续进阶的阅读下一篇《Android触摸屏事件派发机制详解与源码分析三(Activity篇)》 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
上节概述 ---- 1、在 Activity 中的事件都会按照先交由 Activity 中处理 dispatchTouchEvent 。...中是没有 View)则由自身处理事件分发,否则交由子视图决定是否需要分发事件。...即最后由被拦截的 ViewGroup 自身处理的相关事件。...从DecorView到具体的得到焦点的 View(如果中途被拦截,那就是拦截的 View),通过ACTION_DOWN 事件确定了一个 TouchTarget 分发链,那么接续的事件都将通过这条分发链进行处理...4.3、直到确认到有子视图处理时,及终止 ACTION_DOWN 事件的派发。 5、接着事件会逐层 return ,直到回朔到DecorView的实例中。
ContentView中 触摸事件的类型 触摸事件对应的是MotionEvent类,事件的类型主要有如下三种: ACTION_DOWN ACTION_MOVE(移动的距离超过一定的阈值会被判定为ACTION_MOVE...消费(onTouchEvent):方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...注意:在Android系统中,拥有事件传递处理能力的类有以下三种。 Activity:拥有分发和消费两个方法。 ViewGroup:拥有分发、拦截和消费三个方法。...Activity对点击事件的分发过程 我们对触摸屏进行操作时,Linux就会收到相应的硬件中断,然后将中断加工成原始的输入事件并写入相应的设备节点中。...,被ViewGroup拦截时,mFirstTouchTarget则为null。
1、事件分发机制分发的是什么 当用户点击屏幕里View或者ViewGroup的时候,将会产生一个事件对象,这个事件对象就是MotionEvent对象,这个对象记录了事件的类型,触摸的位置,以及触摸的时间等...MotionEvent里面定义了事件的类型,其实很容易理解,因为用户可以在屏幕触摸,滑动,离开屏幕动作,分别对应: MotionEvent.ACTION_DOWN:用户触摸View&ViewGroup。...请看下面的图你就懂的更彻底了: ? 2、ACTION_CANCEL什么时候触发 如果某一个子View处理了Down事件,那么随之而来的Move和Up事件也会交给它处理。...>onTouchEvent>onclick 7、事件分发3个方法返回值的作用 dispatchTouchEvent:方法返回值为true表示事件被当前视图消费掉;返回为super.dispatchTouchEvent...onTouchEvent:方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。
什么是触摸事件 顾名思义,就是触摸手机屏幕后产生的事件。这时候请你拿出手机,点击屏幕中的某个按钮(不要松手),移动一段距离,松手。...分析可知: 触摸事件ev类收到点击的ACTION,会回调onUserInteraction方法,一般项目中我们把一些需要用户开始触摸时就需要执行的任务代码放在这里。...接下来触摸事件ev会传递给Activity窗口绑定的根视图rootView(View/ViewGroup),如果根视图也有子视图,事件ev会一级一级的分发下去,如果在这个过程中ev被消耗了,事件就此结束分发...从中我们看出触摸事件ev会按照子View加入ViewGroup先后顺序相反的顺序,依次有机会去消费此触摸事件ev,即最后加入的最先有机会消费此触摸事件(消费的前提是,触摸点在这个子View的视图范围之内...,继续下一步流程; onTouchEvent() 返回true表示事件被处理了,不用传递给上一级视图; 返回false表示事件交给上一级视图处理; 初始情况下他们的默认返回值都为false。
判断是否拦截后,我们发现他还执行了一句话ev.setAction(action) 官方说明是恢复操作,防止被更改。 事件处理 接下来就是检查事件是否取消咯。...如果没有取消并且没有拦截就执行正常的事件处理。 如果事件是针对可访问性焦点视图,我们将其提供给具有可访问性焦点的视图。如果它不处理它,我们清除该标志并像往常一样将事件分派给所有的 ChildView。...就是如果A和B有重叠的部分,并且B在A的上面,那么他处理的便是B的事件了。而不处理A的事件。 如果子View可以接受事件,那么我们就给他一个触摸的标识。...然后得到是执行自身的事件还是child的事件。 总结 1.ViewGroup包涵多个子view的时候,我们是从后遍历,判断当前view是否可以点击,然后分发给需要处理的子view。...2.我们可以在onInterceptTouchEvent中进行事件拦截。 3.我们可以发现ViewGroup没有onTouchEvent事件,说明他的处理逻辑和View是一样的。
上节概述 从上节View·dispatchTouchEvent 源码分析(三)中,我们分析了 ACTION_DOWN 事件的派发和拦截过程。 接下去,我们分析后续的事件是怎么被处理的!...所以关注下ViewGroup的dispatchTouchEvent()方法。因为 ACTION_DOWN事件已经在前一章被处理过了,所以我们跳过对ACTION_DOWN事件处理的代码片段。...,执行事件派发 // 【代码贴在第8小节里面】 } } 8、之前DecorView的实例在处理ACTION_DOWN事件时,mFirstTouchTarget...所以mFirstTouchTarget代表当前获取焦点的视图(或被代码拦截的视图),作为事件的处理源头开始执行回朔操作。...ACTION_DOWN事件的派发 10、确定了3、2、1这条链之后,在第8点中就能直接对这条链进行事件派发,派发顺序是3、2、1。 ?
,然后消息就从客户端的主View往其下面的子View传递,直到消息被完全处理掉为止。...(图1),然后消息就从客户端的主View往其下面的子View传递,直到消息被完全处理掉为止。...事件的基本流程如下: 事件分配给相应视图,视图处理它,并通知相关监听器。 操作过程中如果发生视图的尺寸变化,则该视图用调用requestLayout()方法,向父控件请求再次布局。...按哪个方向就近可以在XML布局文件中配置。...public boolean onTouchEvent(MotionEvent event) 此函数用于响应触摸屏事件。
触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。...分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。...当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。...由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1...-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。
(本文不打算讲自定义属性和事件处理,因为太多的文章讲这些了) 一、自定义View,你真的掌握了吗? 什么?你说你掌握了自定义View?...当View所在的Activity进入stop状态后,View去哪了?如果我在一个后台线程中持有一个View的引用,我此时能够改变它的状态吗?为什么? View能够与其他的View交叉重叠吗?...这样,在Window中的View们被组织起来了,一个巨大的ViewGroup(以后,我们不再用复合View这个说法,而代之以ViewGroup,二者是一回事),下面有若干ViewGroup和若干View...虽然View无法决定自己在ViewGroup中的位置,但是开发者在使用View时,可以向ViewGroup表达自己所用的View要放在哪里,以vertical LinearLayout为例,开发者书写布局文件时...KeyEvent回调接口,是用来处理键盘事件的,这与onTouchEvent用来处理触摸事件是相对的。
预备知识 MotionEvent 在Android设备中,触摸事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作等。...); } } 所以我们在处理某些滑动冲突场景时,可以从子View中调用父View的requestDisallowInterceptTouchEvent方法,阻止父View拦截事件。...等),且在传递ACTION_DOWN事件过程中没有找到目标子View时,事件将会直接被拦截,交给ViewGroup自己处理。...2.将事件依次分发给子View,若事件被某个View消费了,将不再继续分发; 3.如果2中没有子View对事件进行消费或者子View的数量为零,事件将由ViewGroup自己处理,处理流程和View的处理流程一致...若事件在自上而下的传递过程中一直没有被消费,而且最底层的子View也没有对其进行消费,事件会反向向上传递,此时,父ViewGroup可以对事件进行消费,若仍然没有被消费的话,最后会回到Activity的
=null也就是,当事件由ViewGroup的子元素成功处理时,mFirstTouchTarget会被复制并指向子元素。...这是因为 ViewGroup 在分发事件时,如果是 ACTION_DOWN 就会重置 FLAG_DISALLOW_INTERCEPT 这个标记位,将导致子 View 中设置的这个 标记位 无效。...是否能够接受点击事件主要由两点来衡量;子元素是否在播动画和点击事件的坐标是否落在子元素的区域内。如果某个子元素满足这两个条件,那么事件就会传递给它来处理。...如果遍历所有子 View或ViewGroup,都没有消费事件,这包含两种情况:第一种是ViewGroup没有子元素;第二种是子元素处理了点击事件,但是在dispatchTouchEvent中返回了false...,就像我们最上面写的那个demo一样,是因为在onTOuchEvent中返回了false,这个时候,ViewGroup会自己处理点击事件。
因此,正是考虑到嵌套越深,层级越高,触摸也通常会是交给层级高的来处理,因而也将事件分发设计成递归。 View 排版规则为何设计为“嵌套越深,显示层级越高”呢? 因为这符合常理。...因而首先,在递的过程中,当前层级是执行 child.dispatchTouchEvent: 如果 child 是 ViewGroup,那么实际执行的就是 ViewGroup 重写的 dispatchTouchEvent...时,被设计为对父容器的 ACTION_DOWN 无效 —— 在父容器 dispatchTouchEvent 时,会首先重置 mGroupFlags。...在“归”流程中,唯有当前层级的 super.dispatchTouchEvent 返回了 true,才认定被消费,被消费前,下级都有干活,只是结果不 OK。...希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持! 转发+点赞+关注,第一时间获取最新知识点 Android架构师之路很漫长,一起共勉吧! ---- 以下墙裂推荐阅读!!!
领取专属 10元无门槛券
手把手带您无忧上云