展开

关键词

首页关键词Android事件分发

Android事件分发

当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。上述例子中的消息下发顺序是这样的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。在上述例子中如果⑤的dispatchTouchEvent返回结果为true,那么⑥-⑦-③-④将都接收不到本次Touch事件。来个简单版的代码加深理解:

相关内容

  • Android事件分发备忘

    前言事件的分发是面试的必考题,也是Android作为一个移动系统,与用户交互的基础。由于整个事件分发比较繁杂,这里做一个总结,以作备忘。事实上,Android系统中的事件分发机制是一个委托者模型。三个方法在Android的摸触事件中,我们通常关注的方法有三个。系统中,各个层级的事件分发,拉截和处理。onTouchEvent在onTouchEvent中,Android实现了View的点击拖动等事件。是事件分发的中间环节dispatchTouchEventViewGroup 的 作为中层的控件,不仅需要接收底层的事件(底层会调用ViewGroup的dispatchTouchEvent方法),还要将事件分发到上层
    来自:
    浏览:169
  • 图解 Android 事件分发机制

    在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。Android 事件分发流关于Android 事件分发机制网上的博文很多,但是很多都是写个Demo然后贴一下输出的Log或者拿源码分析,然后一堆的注释和说明,如果用心的去看肯定是收获不少但是确实很难把整个流程说清和记住onTouchEvent处理(相当于拦截),对比ViewGroup的dispatchTouchEvent 事件分发,View的事件分发没有上面提到的4个目标的第3点。
    来自:
    浏览:588
  • 广告
    关闭

    云+社区杂货摊第四季上线啦~

    攒云+值,TOP 100 必得云+社区定制视频礼盒

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到
  • 图解 Android 事件分发机制

    super.dispatchTouchEvent(ev);}Activity 实现了 Window.Callback 接口,所以接下来会调用 Activity 的 dispatchTouchEvent,所以可以将 Activity 作为原始的事件分发者2、事件分发、拦截与消费类型相关方法ActivityViewGroupView事件分发dispatchTouchEvent√√√事件拦截onInterceptTouchEventX√X事件消费onTouchEvent√√√其中,Activity 与 View 没有事件拦截,主要原因是:Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕无法响应事件,不是我们想要的效果;View作为事件传递的最末端,要么消费事件,要么不处理事件进行回传,根本没必要拦截。3、事件分发流程Android View 是树形结构,事件分发流程采用的是责任链模式。
    来自:
    浏览:2191
  • Android 事件分发机制

    事件分发机制在android中非常常见,比如:手势滑动,自定义View,多点触控都有它的身影。1.4 onTouch是触摸事件,当一个触摸事件被分发到一个view的时候。1.5 onTouchEvent真正用来处理触摸事件的最后调用的方法, onTouchEvent是否拦截取决于down事件。2.我们刚才是正常的事件分发流程图,没有给View即TextView设置click事件,那我们现在给TextView设置点击事件看看,事件是怎么分发的? ?image.png 可以看到如果给View设置了click事件,那么事件会最终分发给view,被view消费,这就是我们平时最常用的事件分发流程3.其他的你们都可以在个个阶段的事件分发中,返回不同的值去测试验证的点击事件响应怎么办,按照上面的andorid事件分发流程图,方法多了,我们可以在不同的阶段进行控制,不让事件向下分发,但我们试试onTouch()这个方法,此方法默认返回false,我们现在让它返回true
    来自:
    浏览:473
  • Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识。等等……对于这些问题,我并没有给出非常详细的回答,因为我知道如果想要彻底搞明白这些问题,掌握Android事件分发机制是必不可少的,而Android事件分发机制绝对不是三言两语就能说得清的。而我准备带着大家从源码的角度进行分析,相信大家可以更加深刻地理解Android事件分发机制。阅读源码讲究由浅入深,循序渐进,因此我们也从简单的开始,本篇先带大家探究View的事件分发,下篇再去探究难度更高的ViewGroup的事件分发。 那我们现在就开始吧!今天的讲解就到这里了,相信大家现在对Android事件分发机制又有了进一步的认识,在后面的文章中我会再带大家一起探究Android中ViewGroup的事件分发机制,感兴趣的朋友请继续阅读 Android
    来自:
    浏览:308
  • Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    记得在前面的文章中,我带大家一起从源码的角度分析了Android中View的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了。还未阅读过的朋友,请先参考 Android事件分发机制完全解析,带你从源码的角度彻底理解(上) 。那么今天我们将继续上次未完成的话题,从源码的角度分析ViewGroup的事件分发。简单介绍完了ViewGroup,我们现在通过一个Demo来演示一下Android中VewGroup的事件分发流程吧。Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。2.子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。好了,Android事件分发机制完全解析到此全部结束,结合上下两篇,相信大家对事件分发的理解已经非常深刻了。
    来自:
    浏览:451
  • Android事件分发机制源码解析

    触摸事件传递机制是Android中一块比较重要的知识体系,了解并熟悉整套的传递机制有助于更好的分析各种滑动冲突、滑动失效问题,更好去扩展控件的事件功能和开发自定义控件。预备知识MotionEvent在Android设备中,触摸事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作等。一个最简单的用户触摸事件一般经过以下几个流程:手指按下手指滑动手指抬起Android把这些事件的每一步抽象为MotionEvent这一概念,MotionEvent包含了触摸的坐标位置,点按的数量(手指的数量几个方法事件分发过程中,涉及的主要方法有以下几个: dispatchTouchEvent: 用于事件的分发,所有的事件都要通过此方法进行分发,决定是自己对事件进行消费还是交由子View处理 onTouchEvent开始遍历所有子View开始逐个分发事件 final int childrenCount = mChildrenCount; if (childrenCount !
    来自:
    浏览:171
  • 进阶必备-Android事件分发机制

    这种滑动冲突的解决需要我们清楚的掌握View的事件分发机制。那下面我们详细的讲解下View的整个事件机制。Android将View的事件封装到MotionEvent这个类中,这也是监听touch事件中回调给我们的参数public boolean onTouchEvent(MotionEvent event),外层View想自己处理接下来的事件,就拦截了事件分发,此时内层View就会收到ACTION_CANCEL的事件。onInterceptTouchEvent(MotionEvent event)用来申明是否拦截事件继续向下分发,如果返回true,事件将不会继续向下分发,而是交由自己的onTouchEvent方法处理二、详细分析View的分发事件我们都知道,Android的View是树形结构的,所以当一个事件来临的时候一般是从根部分发下来的。
    来自:
    浏览:434
  • Android事件分发简单梳理

    在说事件分发机制之前我们先来看看都有哪些基本的事件事件触发场景单词事件流中触发的次数MotionEvent.ACTION_DOWN在屏幕上按下1次MotionEvent.ACTION_UP在屏幕上抬起0或1次MotionEvent.ACTION_MOVE在屏幕上移动0或N次MotionEvent.ACTION_CANCEL滑动超出空间边界时0或1次当我们的手指在android手机上点按或者滑动时会触发一系列的事件流App展示的一个页面大致包含如下几部分:Activity:是我们看到的整屏幕范围View Group:View子类,同时也是View的容器,可以包含多个ViewView:我们常规看到的各种UI组件的基类分发机制的核心方法对事件分发起关键作用的有三个方法onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }新版本的Android,也就是Activity负责将事件传递下去,一般不做处理ViewGoup的事件分发 @Override public boolean dispatchTouchEvent(MotionEvent ev)
    来自:
    浏览:162
  • android View事件分发实测

    刚刚翻出了多年前的笔记,是我实战测试View事件分发的结果。主要测试dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent方法调用流程。;import android.os.Bundle;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.TextView(标签:android、View、事件分发)
    来自:
    浏览:126
  • Android ViewGroup事件分发

    上篇文章已经分析了Android的Touch事件分发。如果没看的建议先看一下。Android View的Touch事件分发。-> View.onTouch -> View.onTouchEven只是在UP事件的时候最后多了一个click事件。,其他事件就没有了。到这里,ViewGroups事件分发源码的流程就分析了,我们根据这个来说说上面的场景。返回的是super,也就是false,所以就会通过dispatchTransformedTouchEvent来执行TouchView的dispatchTouchEvent,后面就是View的Touch事件分发了
    来自:
    浏览:493
  • Android事件分发机制详解

    事件分发机制详解一、基础知识介绍1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等2、常用的方法有onInterceptTouchEvent()(只有ViewGroup才有这个方法,View没有这个方法,且ViewGroup是View的子类);二、方法功能介绍1、dispatchTouchEvent事件分发的调度者与指挥者三、各个方法和控件之间事件传递关系事件传递流程:事件—>Activity—>Window—>DecorView—>ViewTree(嵌套在一起的各种控件)一个事件,首先会由Activity的dispatchTouchEvent方法接受,然后分发到附着在Activity上的Window,Window不进行处理直接分发到ViewTree;最外层的ViewTop(默认为是ViewGroup类型的)会先调用自己的dispatchTouchEvent方法,然后由dispatchTouchEvent调用onInterceptTouchEvent方法,如果返回true,调用自己的onTouchEvent方法;如果返回false,继续向下一个控件进行事件分发
    来自:
    浏览:200
  • Android事件分发原理分析

    MotionEvent.ACTION_DOWN传递在Android中,触碰控件的时候回产生一个ACTION_DOWN事件并逐层向下传递,首先ACTION_DOWN回先从Activity的dispatchTouchEvent= null,所以会通过mFirstTouchTarget.child来把ACTION_UP继续分发给子View,前提当然是当前这个ViewGroup满足事件分发条件,例如事件未被拦截,这样ACTION_UPsuper.requestDisallowInterceptTouchEvent(disallowIntercept); }}MyTextView:public class MyTextView extends android.support.v7public boolean isClickable() { return super.isClickable(); }}MyButton:public class MyButton extends android.support.v7:ViewGroup中的dispatchTouchEvent方法,负责把事件分发给子View,如果没有子View,就自己处理了ViewGroup的onInterceptTouchEvent方法,是否拦截触摸事件
    来自:
    浏览:292
  • android viewgroup事件分发机制

    今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因;  import android.util.AttributeSet;  import android.util.Log;  import android.view.MotionEvent;  importView的事件分发机制,当child.dispatchTouchEvent(ev)返回true,则为mMotionTarget=child;然后return true;ViewGroup的ACTION_DOWN分析结束,总结一下:ViewGroup实现捕获到DOWN事件,如果代码中不做TOUCH事件拦截,则开始查找当前x,y是否在某个子View的区域内,如果在,则把事件分发下去。return target.dispatchTouchEvent(ev); 可以看到,正常流程下,ACTION_MOVE在检测完是否拦截以后,直接调用了子View.dispatchTouchEvent,事件分发下去
    来自:
    浏览:325
  • 可能是讲解Android事件分发最好的文章

    作者:milter地址:http:www.jianshu.comp2be492c1df96声明:本文是milter原创,已获其授权发布,未经原作者允许请勿转载我几乎看过国内讲解Android事件分发的所有文章,但遗憾的是都没有这篇讲的好,原因有二:它阐明了具体的事件分发机制的设计意图,让人既知其然,又知其所以然;它没有贴源码,吓唬本宝宝。所以我决定将它翻译出来,造福广大Android开发者。原文请点击这里:http:balpha.de201307android-development-what-i-wish-i-had-known-earlier有时,你必须要自己处理触摸事件(touchDOWN事件,但没办法,没有子View愿意处理该事件。
    来自:
    浏览:257
  • Android面试题精选:讲一讲 Android 的事件分发机制

    面试场景 讲讲 Android 的事件分发机制?() 是负责事件分发的。需要总结的小点: 1、Android 事件分发总是遵循 Activity => ViewGroup => View 的传递顺序; 2、onTouch() 执行总优先于 onClick() 原本想用文字总结的,结果发现简书上还有这样一篇神文:Android事件分发机制详解:史上最全面、最易懂,所以直接引用一下其中的图片。Activity 的事件分发示意图?ViewGroup 事件分发示意图?View 的事件分发示意图?事件分发工作流程总结?最后 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!
    来自:
    浏览:409
  • Android 触摸事件分发和拦截机制

    Android 开发中,很多情况下,我们需要对触摸事件进行处理,但是当面对错综复杂的 Android 布局时,我们如何准确的将一个用户的触摸事件传递到对应的控件中并让它进行处理呢?这个方法的作用是把触摸事件的分发方法,其返回值代表触摸事件是否被当前 View 处理完成(truefalse)。?,当这个 ViewGroup 接收到触摸事件的时候, * 这个方法首先被调用,用于分发接收到的触摸事件,父类方法默认返回false * @Override public boolean dispatchTouchEvent,当这个 View 接收到触摸事件的时候, * 这个方法首先被调用,用于分发接收到的触摸事件,父类的方法默认返回 false * @Override public boolean dispatchTouchEvent因而 LinearLayout 不能接收到触摸事件,它的 onTouchEvent 方法不会被调用。好了,对于Android 事件分发拦截,总结起来就是: 先由外向里,再由里向外。
    来自:
    浏览:307
  • Android--事件分发机制(二)

    上次说到View的事件方法,并查看了源码,今天我们更加深入源码,了解事件分发的前世今生以前分析Activity启动流程时,我们知道Activity是由PhoneWindow,DecorView,我们xml中写的布局、控件等组成,很显然事件分发首先被接受到的是Activity,果然在Activity中也发现了dispatchTouchEvent方法 public boolean dispatchTouchEvent如果是ACTION_DOWN事件,则初始化一些操作,TouchTarget是记录多个手指头事件的单链表 cancelAndClearTouchTargets(ev); resetTouchState()调用真正做分发的方法dispatchTransformedTouchEvent,注意这里第三个参数:child传了null handled = dispatchTransformedTouchEventtrue; } else { final boolean cancelChild = resetCancelNextUpFlag(target.child) || intercepted; 调用真正做分发的方法
    来自:
    浏览:114
  • android view事件分发机制

    首先我们先写个简单的例子来测试View的事件转发的流程~1、案例为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~MyButtonpackage;  import android.os.Bundle;  import android.util.Log;  import android.view.MotionEvent;  import android.view.View;  import android.os.Bundle;  import android.util.Log;  import android.view.MotionEvent;  import android.view.View可以看到LongClickListener已经ClickListener都触发了~最后,本篇博文完成了对View的事件分发机制的整个流程的说明,并且对源码进行了分析;当然了,View结束,肯定到我们的ViewGroup了,请点击:Android ViewGroup事件分发机制
    来自:
    浏览:283
  • Android事件分发机制 源码级

    事件分发.png开篇先明确几点1.有三东西挺长的,又长得挺像,看着晃眼且心烦,文中以下简写为:|-- 分发 dispatchTouchEvent = d16t |-- 截断 onInterceptTouchEvent= o19t |-- 消费 onTouchEvent = o10t 2.事件分发机制的参与者与各自拥有的回调方法:|-- 灰色 Activity: o10t d16t |-- 紫色 ViewGroup:28:32.121: onTouchEvent:--1 --卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍1.4 小结一下d16t 从测试上看到的结论: dispatchTouchEvent的作用在于分发事件,消费之后不会再往下传递这里还是想强调一下和的区别,一者消费,一者分发由于消费在分发之前,消费是不会阻碍分发的,但分发会影响消费 老婆(Activity):给你100块当做一月生活费,这叫分发dispatchTouchEvent在自定义View中至多也就是ViewGroup+子View的触摸事件协调,Activity一般不参和 Activity的事件分发实质上是DecorView的事件分发,所以都是View家的,Activity
    来自:
    浏览:191

扫码关注云+社区

领取腾讯云代金券