image.png 原文链接:https://juejin.im/post/5eb3e0d6f265da7c002028cd 这次说下Android中的事件分发机制 从开始点击屏幕开始,就会产生从...当其他事件来的时候,要看当前viewgroup是否消费了事件,如果当前viewgroup已经消费了事件,没传到子view,那么mFirstTouchTarget字段就为空,所以就不会执行到后面的代码,就直接消费掉所有事件了...这就符合了之前的所说的一种机制: 某个view一旦开始拦截,那么后续事件就全部就给它处理了,也不会执行onInterceptTouchEvent方法了 但是,两个条件满足了一个,就能执行到onInterceptTouchEvent...事件分发的应用(requestDisallowInterceptTouchEvent) 那既然学会了事件分发机制,我们实际工作中会怎么应用呢?其实最常见的就是解决滑动冲突的问题。...至此,事件的分发机制也就说的差不多了。 文末 您的点赞收藏就是对我最大的鼓励! 欢迎关注我,分享Android干货,交流Android技术。
这个过程一般会产生如下几个事件: 点击(Down)事件 移动(Move)事件 松手(Up)事件 Android为我们封装好了一个触摸事件类MotionEvent,上述的三个过程分别对应着MotionEvent...事件三剑客 一般事件的分发过程是由事件三剑客(方法)来共同完成的。...所有的视图布局都没有消耗掉ev事件,就会调用Activity的onTouchEvent()方法。下面会具体讲诉。 Android界面简析 在具体讲诉前,我们先来了解下的android的界面架构。...android卷三),并通过Activity来回调相应的监听。...Ref Mastering the Android Touch System Android群英传 …
事件分发机制在android中非常常见,比如:手势滑动,自定义View,多点触控都有它的身影。...如果返回true,则代表拦截该事件,停止传递给子view,会走自己的onTouchEvent事件 事件被拦截后,子view会接收到一个cancel事件,来恢复之前的状态,结束当前事件流。...1.4 onTouch 是触摸事件,当一个触摸事件被分发到一个view的时候。...,所以事件一路传递下来,又一路回溯回去,所以最终事件就被Activity消费了(就是Activity的UP事件)。...2.我们刚才是正常的事件分发流程图,没有给View即TextView设置click事件,那我们现在给TextView设置点击事件看看,事件是怎么分发的? ?
今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因...; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; ...super.requestDisallowInterceptTouchEvent(disallowIntercept); } } 继承LinearLayout,然后复写了与事件分发机制有关的代码.../apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent...View的事件分发机制,当child.dispatchTouchEvent(ev)返回true,则为mMotionTarget=child;然后return true; ViewGroup的ACTION_DOWN
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android...废话不多说,总结一句:事件分发机制很重要。...Android 事件分发流 关于Android 事件分发机制网上的博文很多,但是很多都是写个Demo然后贴一下输出的Log或者拿源码分析,然后一堆的注释和说明,如果用心的去看肯定是收获不少但是确实很难把整个流程说清和记住...return true),事件分发机制就像递归,return false 的意义就是递归停止然后开始回溯。...作者简介:Kelin,国内某知名互联网公司Android码农一枚,微博 :http://weibo.com/KelinHong GitHub:https://github.com/Kelin-Hong
-基于回调的事件,这个还真以前没用过,然后就想着把android事件处理机制的知识点都整理一遍,嗯,就是这样的。...3.基于回调的事件 3.1回调机制与监听机制 如果说事件监听机制是一种委托的事件处理,那么回调机制则与之相反,对于基于事件的处理模型来说,事件源与事件监听器是统一的,或者说是事件监听器完全消失了...,当用户在UI组件上触发某个事件时,组建自己特定的方法将会负责处理事件 为了使回调方法机制类处理UI组件上发生的事件,开发者需要为该组件提供对应的事件处理方法,而java是一种静态语言,无法为某个对象动态的添加方法...,因此只能继续是用UI组件类,并通过重写该类的事件处理的方法来实现 为了处理回调机制的事件处理,android为所有UI组件提供了一些事件处理的回调方法。...4.Handler消息传递机制 出于性能优化考虑,android的ui线程操作是不安全的,这意味者如果多个线程并发操作UI组件,可能导致线程安全问题,为了解决这个问题,android制定了一条简单的规则
前言:在Android开发中,经常会遇到触摸事件冲突,比如ViewPager的轮播图跟Fragment的划动事件冲突,或者轮播图跟下拉事件冲突,自定义view的事件处理等,本文章将会详细介绍Activity...、View、ViewGroup三者的触摸事件传递机制,传递包括三个阶段:分发、拦截、消费。...本文章将会详细介绍Activity、View、ViewGroup三者的触摸事件传递机制,传递包括三个阶段:分发、拦截、消费。...二.触摸事件的传递阶段 1.分发(Dispatch) 在Android系统中所有的触摸事件都是由 dispatchTouchEvent 方法进行分发的。...dispatchTouchEvent 、OnInterceptTouchEvent 、OnTouchEvent View:拥有dispatchTouchEvent 、OnTouchEvent 三、View的事件传递机制
简介: Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEvent ev);方法。...Touch事件传递拥有记忆功能,处理了一次事件传递,假定底层布局都没发完成事件,最后是由顶层父布局自己处理的。那么,相同事件再次产生的时候,顶层布局就不会向下分配,而是自己直接处理事件。...总结: 可以看出这个公司的小例子正好对应了Touch事件传递机制。一层一层往下传递,当下面无法完成时,又网上回传。...点击蓝色区域,那么应该发生的传递机制为任务一级一级的传下来,TextView(实习生)之后,任务被完成了。当再遇到相同的任务时,任务还是会被一级一级的传下来,最后由TextView(实习生)解决。...这里体现出了Touch时间传递机制的记忆性。 ? 此图是点击蓝色区域后log打印出的信息,值得注意的是,当FrameLayout按照传递的记忆性直接执行完成任务时,是不会触发拦截方法的。 ?
2、事件分发、拦截与消费 类型 相关方法 Activity ViewGroup View 事件分发 dispatchTouchEvent √ √ √ 事件拦截 onInterceptTouchEvent...X √ X 事件消费 onTouchEvent √ √ √ 其中,Activity 与 View 没有事件拦截,主要原因是: Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕无法响应事件...,不是我们想要的效果;View 作为事件传递的最末端,要么消费事件,要么不处理事件进行回传,根本没必要拦截。...3、事件分发流程 Android View 是树形结构,事件分发流程采用的是责任链模式。...表示事件消费, 5、事件在从 Activity.dispatchTouchEvent 往下分发的过程中。
首先我们先写个简单的例子来测试View的事件转发的流程~ 1、案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~...="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android...OnClick事件无法触发; ii.没有设置onLongClickListener或者onLongClickListener.onClick返回false,则点击事件OnClick事件依然可以触发;...可以看到LongClickListener已经ClickListener都触发了~ 最后,本篇博文完成了对View的事件分发机制的整个流程的说明,并且对源码进行了分析; 当然了,View结束,肯定到我们的...ViewGroup了,请点击:Android ViewGroup事件分发机制
ViewGroup类中的源码实现就是{return false;}表示不拦截该事件, 事件将向下传递(传递给其子View); 若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递,...; import android.util.Log; import android.view.MotionEvent; import android.widget.ScrollView; public...; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import...> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="...,那么这次的事件就继续交给下面的来处理,若上次的事件没有被下面的处理成功,那么这次的事件就不会向下传递了,该View直接调用自己的onTouchEvent()方法来处理该事件。
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2、...,触发的第一个方法 2、onInterceptTouchEvent,决定是否拦截事件: 3、如果拦截事件,调用当前控件的onTouchEvent方法, 4、如果不拦截,判断是否有子控件, 5、onTouchEvent...,决定是否消费事件,消费返回True,不消费返回False。...如果返回的为false,之后的事件都不会再传递到当前的控件了(会不再访问当前控件),如果返回true,之后的事件依然还是会传递过来的。...三、各个方法和控件之间事件传递关系 事件传递流程:事件—>Activity—>Window—>DecorView—>ViewTree(嵌套在一起的各种控件) 一个事件,首先会由Activity的dispatchTouchEvent
【工匠若水 http://blog.csdn.net/yanbober】 Notice:阅读完该篇之后如果想继续深入阅读Android触摸屏事件派发机制详解与源码分析下一篇请点击《Android触摸屏事件派发机制详解与源码分析二...就算你不自定义控件,你也必须要了解Android控件的触摸屏事件传递机制(之所以说触摸屏是因为该系列以触摸屏的事件机制分析为主,对于类似TV设备等的物理事件机制的分析雷同但有区别。...哈哈,谁让我之前是做Android TV BOX的,悲催!),只有这样才能将你的控件事件运用的如鱼得水。接下来的控件触摸屏事件传递机制分析依据Android 5.1.1源码(API 22)。...3 Android 5.1.1(API 22) View触摸屏事件传递源码分析 3-1 写在前面的话 其实Android源码无论哪个版本对于触摸屏事件的传递机制都类似,这里只是选用了目前最新版本的源码来分析而已...分析Android View事件传递机制之前有必要先看下源码的一些关系,如下是几个继承关系图: 怎么样?
触摸事件 在用户触摸屏幕时,总是离用户触摸点最近的控件来响应触摸事件,如果最近的控件没有实现响应事件,那这个事件会不断的向父类传递,直到有view响应时,就会将触摸反馈的事件流传递给这个view的onTouchEvent...Android 自定义触摸反馈事件时,通常都是如下的写法: public class MyView { // ......2.触摸反馈事件流是以ACTION_DOWN开始,以ACTION_UP或者ACTION_CANCEL结束的一组事件,例如: 按钮点击事件的触摸反馈事件流 ACTION_DOWN -> ACTION_MOVE...结果: 产生点击事件,事件流是这样的: 原因: Button是离用户触摸点最近的控件,并且消费了本次的事件流。...这是因为Listview在onInterceptEvent()中判断出本次是滑动事件,从而拦截了本次事件流,来让自己处理本次事件流。
在安卓中如果我们需要点击一个控件,并做处理的话,首先想到的就是setOnClickListener方法和setOnTouchListener方法,而在自定义控件中,需要自己处理触摸事件的话,我们需要改写...这些方法的执行顺序和怎么被调用的,就是今天的研究课题 首先自定义一个控件,并改写onTouchEvent方法,打印日志 /** * 测试事件分发顺序 */ public class MyView extends...final int ACTION_UP = 1; public static final int ACTION_MOVE = 2; 所以一个控件触摸事件的顺序是先调用...boolean dispatchTouchEvent(MotionEvent event) { //AccessibilityService是辅助残疾人士使用手机的功能,可以模拟触摸事件...,首先在事件分发前, //会判断是否是模拟触摸事件 // If the event should be handled by accessibility focus first
上次说到View的事件方法,并查看了源码,今天我们更加深入源码,了解事件分发的前世今生 以前分析Activity启动流程时,我们知道Activity是由PhoneWindow,DecorView,我们xml...中写的布局、控件等组成,很显然事件分发首先被接受到的是Activity,果然在Activity中也发现了dispatchTouchEvent方法 public boolean dispatchTouchEvent...//如果是ACTION_DOWN事件,则初始化一些操作,TouchTarget是记录多个手指头事件的单链表 cancelAndClearTouchTargets(ev);...findChildWithAccessibilityFocus() : null; //事件为ACTION_DOWN时会执行下面代码 if...transformedEvent.recycle(); return handled; } 事件分发中,最复杂的就是事件的开始,即ACTION_DOWN事件,最后,总结了事件分发的流程草图
34B66A6E-F3C7-4D02-A508-14F271CD3445.png A6A6A7B1-1CC9-4820-9F87-D513CA85F93C.p...
Android事件分发机制 我们只考虑最重要的四个触摸事件,即:DOWN,MOVE,UP和CANCEL。...一个手势(gesture)是一个事件列,以一个DOWN事件开始(当用户触摸屏幕时产生),后跟0个或多个MOVE事件(当用户四处移动手指时产生),最后跟一个单独的UP或CANCEL事件(当用户手指离开屏幕或者系统告诉你手势...DOWN事件,但没办法,没有子View愿意处理该事件。...拦截事件 现在,让我们更进一步,假设B没有拦截DOWN事件,但它拦截了接下来的MOVE事件。原因可能是B是一个scrolling view。...然后,这个MOVE事件将会被系统变成一个CANCEL事件,这个CANCEL事件将会传递给C的onTouchEvent方法。
运行的环境 所有的源码都基于API 26,也就是Android8.0奥利奥,Android Studio 3.0.1,想要自己敲代码试试的同学可以参考一下 进入正题 分析点击事件分发流程,是想弄明白当我们用手指去点击屏幕的时候...搭建最简单的结构 新建Activity,重写dispatchTouchEvent和onTouchEvent,前面的方法负责点击事件的分发,后面的方法负责点击事件的消耗,然后打印三种触摸事件的触发 private...这里有个需要注意的地方就是Android的控件有些是默认可以点击的(如Button),还有一些是默认不可点击的(如TextView)他们的分发是有一些不同的,这里我们先看不可点击的,新建一个类继承android.support.v7...默认可点击控件的事件分发 比如Button这种默认可以点击的控件,或者设置android:clickable=”true”的控件,在分发流程中有一些不同,主要是onTouchEvent的默认方法不同,它直接消耗点击事件...可点击View的事件分发流程 ?
一、简介 或许你会问,“为什么我一定要知道View的事件分发机制?”。因为我们在实际开发的过程中,经常会遇到多层的View互相嵌套以后,对某一个View进行滑动的时候,特别不灵敏,甚至于没法滑动。...这种滑动冲突的解决需要我们清楚的掌握View的事件分发机制。那下面我们详细的讲解下View的整个事件机制。...Android将View的事件封装到MotionEvent这个类中,这也是监听touch事件中回调给我们的参数public boolean onTouchEvent(MotionEvent event)...判断自己是否有拦截,如果拦截事件,将调用父View自己的onTouchEvent方法去处理事件,如果没有拦截事件,事件将继续分发到子View中处理。...二、详细分析View的分发事件 我们都知道,Android的View是树形结构的,所以当一个事件来临的时候一般是从根部分发下来的。
领取专属 10元无门槛券
手把手带您无忧上云