android事件分发机制

Android事件分发机制 开始的开始 当我手指触摸到手机屏幕后,给我所见即所得的触控体验,它的背后发生了什么?出于对它的好奇,就有了这篇文章。因为本人不喜欢大段大段的源码分析,所以本文尽量从设计的角度去把把事件分发机制的脉络,少贴源码是我的目标之一,虽然这么说,但当我把文章写完后最后发现依然贴了不少代码,想删减却没法减少,都是很核心的部分。本博客的主要内容如下: 事件分发的整体设计 ViewRootImpl的创建 应用层级的事件分发流程 为了后面更容易的理解事件分发机制,在介绍核心内容前,准备了一些前置知识。 前置知识:View 阅读详情

http://blog.youkuaiyun.com/guolin_blog/article/details/9153747这个地址是一个牛人写的有关andriod事件分发机制的博客,看了好几篇他写的文章,写的太好了,可以去看看哦...

看完博客之后,总结几句:

android事件分发机制:
 View的事件分发:
 1,触摸一个view控件,首先调用它的dispatchTouchEvent方法
 2,dispatchTouchEvent方法中,首先进行3个条件的判断
  mOnTouchListener != null
  && (mViewFlags & ENABLED_MASK) == ENABLED
  &&  mOnTouchListener.onTouch(this, event))
 3,3个条件同时满足,则返回true,否则调用onTouchEvent(event)方法
  第1个条件mOnTouchListener != null,只要我们设置了setOnTouchListener(OnTouchListener l)事件,就一定为true
  第2个条件mViewFlags & ENABLED_MASK) == ENABLED,判断当前点击的控件是否是enable的
  第3个条件mOnTouchListener.onTouch(this, event),是我们设置的setOnTouchListener(OnTouchListener l)监听中的回调方法,
   也就是说,我们在onTouch方法中,返回的是true,这个条件就是true
 4,对于一个button来说,第2个条件肯定为true,(注意,对于imageview就不是true了哦),
  那么第3个条件就最关键了,
  如果我们在onTouch中返回true,那么onTouchEvent方法就不会被执行了;
  如果我们在onTouch中返回false,那么onTouchEvent方法就会被执行。
 5,在onTouchEvent事件中,
  if (((viewFlags & CLICKABLE) == CLICKABLE || 
             (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) 这个条件如果成立,结果肯定是返回true,
             也就是控件如果是可以点击的,(button肯定是可以点击的,ImageView默认是不可点击的哦)那么就会调用到onClick方法,最终返回true
     
 touch事件的层级传递:
  我们都知道如果给一个控件注册了touch事件,每次点击它的时候都会触发一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。
  这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。
  简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。
  也可以理解为,前一个action返回false,意思是没有消费掉,系统认为一直是这个事件,而没有发生其他事件,所以不会响应后面的action。


为什么总是强调ImageView的特殊性呢?
如果给ImageView注册 setOnTouchListener监听,则如果第3个条件onTouch返回false,那么也是会只响应MOVE_DOWN事件,
因为ImageView默认是不可点击的,在进入onTouchEvetn事件中后,不会进入if (((viewFlags & CLICKABLE) == CLICKABLE || 
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE))条件,最终返回的是false,所以就不会响应后面的MOVE_UP事件了。

 

ViewGroup的事件分发流程:
 当你点击了某个控件,首先会去调用该控件所在布局的dispatchTouchEvent方法,
 然后在布局的dispatchTouchEvent方法中找到被点击的相应控件,再去调用该控件的dispatchTouchEvent方法。
  1,点击某个控件,首先调用该控件所在布局的dispatchTouchEvent方法,
  2,在dispatchTouchEvent方法中,会判断disallowIntercept || !onInterceptTouchEvent(ev),
   disallowIntercept是指是否禁用掉事件拦截的功能,默认是false,也可以通过调用requestDisallowInterceptTouchEvent方法对这个值进行修改
   onInterceptTouchEvent(ev)  viewGroup的这个方法默认是返回false的,取反后为true
  3,如果disallowIntercept || !onInterceptTouchEvent(ev)判断为true的话,会对该布局文件的各个子view进行判断,是否是别点击的控件,
  如果是,就会返回true,消费掉事件。这样布局文件viewgroup就不会接收到事件了
  如果遍历完成,没有消费掉事件,则会调用super.dispatchTouchEvent(ev);  也就是viewgroup的父类的这个dispatchTouchEvent(ev)方法,即view的这个方法,
  这样就接着是view的事件分发了。
  
 总结:
  1. Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
  
  2. 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
  
  3. 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。

           

安卓面经_Android面经(18/30)之事件分发机制全解析 事件分发机制属于安卓基础面试必问题目之一。最关键是理解事件分发三个函数的作用和返回值的含义,就基本足够应付面试了 阅读详情

相关推荐

MATLAB实战:手把手教你实现Gardner环路位同步(附完整代码)

本文通过MATLAB实战,详细讲解了Gardner环路位同步算法的原理与实现。内容涵盖插值滤波器、定时误差检测、环路滤波器与数控振荡器等核心模块,并提供完整代码和调试技巧,帮助读者掌握数字通信中关键的符号定时同步技术。

weixin_29048775的博客 174

安卓-Android事件分发机制详解

链接: 原帖跳转 如何提升安卓水平?安卓开发者必须了解的事件分发机制。 最全面、最易懂的形式来讲解Android事件分发机制。 0. 前言 鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇、实践篇与高级篇。 (一)基础篇:从基本概念入手,介绍了分发机制中的核心方法,通过分析其核心逻辑,总结其事件分发机制。 (二)实践篇:该篇设计了简单与复杂的两个demo样例,从现象与应用的角度去讲解分发机制的核心内容,帮助读者从另一个角度理解事件分发机制。 (三)高级篇:从源码角度去分析分发机

ruiruiddd的博客 839

ASM磁盘通过rebalance迁移

一、实施要点: 1、数据迁移前,如果库不大,最好全库备份一次 2、进行数据平衡时,数据磁盘是添加到现有磁盘组,而不是重新建一个磁盘组 3、本次实施过程,服务器只有1张HBA卡,本次实施先取消原有的多路径,只保留旧有存储单路径,另一个FC口插上新存储的路径。待迁移完成后,再配置新存储的多路径 二、实施步骤 1.查询并配置ASM磁盘 [root@rac1 ~]# /sbin/scsi_id...

qq_40673916的博客 1370

Android ——事件分发机制

用户在使用app时,会经常频繁的触摸屏幕,点击页面交互,打开需要的功能。用户触摸点击的动作,就涉及到app中相关UI的触摸和点击事件。事件在UI中传递和处理的过程,就是事件分发流程。发生一次点击事件时,事件会按照Activity->ViewGroup->View的顺序,进行事件传递。

qq_45730283的博客 2220

基于单片机控制的开关电源设计

采用开关电源技术和MCU模块,凭借可靠性高、易于调适的特点,可以更高效地发挥出二者的优势,从而实现更好的组合。stm32的起动模式是通过Boot0和Boot1两个管脚的高低电平来决定的,当stm32被供电之后,这两个管脚的电平。在 VCC上,键盘的一头(列线)被连接到 VCC上,而在“0”的编程输出中,则用来进。,在开关管打开的情况下,由输入电力供给电流,感应装置存储   Buck变换器是一种非隔离式的电压转换器[10]整流电路对输入电压进行整流,再经过滤波电路,即Dc电压是直流/直流变换器的直流输入。

QQ1694456187的博客 2307

LVGL8.x 实体按键与Keypad驱动的无缝对接实战

本文详细解析了LVGL8.x中实体按键与Keypad驱动的两种对接方案:坐标映射的Button方式与事件驱动的Keypad方式。重点阐述了如何模块化裁剪lv_port_indev.c模板文件,并深入讲解了Keypad驱动与Group焦点管理系统的核心协作机制,为无触摸屏的嵌入式设备提供流畅的UI交互解决方案。

weixin_29164497的博客 446

【Android】事件分发机制

从上表可以看到 Activity和 View都是没有事件拦截的,这是因为:Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕都无法响应事件,这肯定不是我们想要的效果。View作为事件传递的最末端,要么消费掉事件,要么不处理进行回传,根本没必要进行事件拦截。

2303_79296612的博客 1725

用示波器抓取同步Buck自举电容波形:从充电回路到SW节点振铃的完整分析

本文通过实测TI TPS54561和MPS MPQ4572同步Buck芯片,详细解析了自举电容在充电、维持和放电三个工作阶段的波形特征。重点揭示了电感泄放回路与充电回路重叠时,在SW节点引发的振铃现象及其产生机理,并提供了串联阻尼电阻等有效的工程抑制方法。文章结合示波器实测,为硬件工程师提供了从波形观测到问题调试的完整实践指南。

weixin_29276847的博客 371

安卓事件分发机制

此方法用来处理事件的分发,当事件传递给当前View时,首先就是通过调用此方法进行传递的,如果当前View所包含的子View的dispatchTouchEvent方法或者当前View的onTouchEvent方法处理了事件,通常返回true,表示事件已消费,如果没有处理则返回false。用来处理事件,如果事件被消费了,通常返回true,否则返回false,并再同一个事件序列中,当前View不会再接受到事件。事件是指用户与应用程序交互时产生的动作或操作,如触摸事件、手势事件、按键事件。

weixin_45911701的博客 1004

【MUJOCO控制篇-2】控制一个简单的机械臂

本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。

echo_Fangyb的博客 6746

Python爬虫实战:Boss直聘职位数据采集实战 - Playwright + 结构化解析完整方案(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 2185

安卓触摸事件分发机制分析

🎯 一句话总结:触摸事件(TouchEvent)会从Activity层开始,按从外到内的方式传递给每一个 ViewGroup/View,直到某个 View消费(consume)它,事件传递就会停止。📌 事件分发三个关键方法方法名所在类作用说明所有 View/ViewGroup事件分发入口,决定是否继续向下传递仅 ViewGroup是否拦截事件,阻止传递给子 View所有 View/ViewGroup事件的最终处理者(消费者)DecorView是一个应用窗口的根容器,它本质上是一个。

WriteBug001的博客 971

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

安卓view事件分发机制

安卓view事件分发机制

似霰的博客 981

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

安卓入门三十四 事件分发机制原理

这种设计是非常精巧的,上层View既可以直接拦截该事件,自己处理,也可以先询问(分发给)子View,如果子View需要就交给子View处理,如果子View不需要还能继续交给上层View处理。如下图,View是一层一层嵌套的,当手指点击View1的时候,下面的ViewGroupA、RootView等也是能够响应的,为了确定到底应该是哪个View处理这次点击事件,就需要事件分发机制来帮忙。前面我们了解到了我们的View是树形结构的,基于这样的结构,我们的事件可以进行有序的分发。

weixin_52735932的博客 931

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android View的事件分发机制

Android View的事件分发机制

m0_74448051的博客 1152

带你深入了解Android的事件分发机制

事件拦截(Event Intercept):事件拦截是指在事件分发过程中,某个ViewGroup可以拦截事件的传递,阻止它传递给子View。Android的事件分发机制是指在Android系统中,如何将用户的触摸事件、按键事件等传递给正确的View进行处理的一套机制。值得注意的是,在编写代码时,需要仔细理解每个方法的作用和调用时机,确保事件的正确传递和处理,避免潜在的问题和冲突。通过重写以上方法,你可以根据自己的需求来实现事件的分发和处理逻辑,例如拦截特定的手势,定制化事件的响应等。

Dakaring的专栏 2680

Android 事件分发机制深度解析

答:Activity -> Window -> DecorView -> ViewGroup -> View。内部拦截法:子View调用requestDisallowInterceptTouchEvent():消费ACTION_DOWN的View将接收整个事件序列。后续事件:若未拦截DOWN,仍可拦截MOVE/UP。:View应在DOWN时初始化触摸状态。:一旦拦截,整个事件序列不再检查拦截。:GONE状态的View不参与分发。:后添加的子View优先(可通过。:仅分发到触摸区域内的子View。

qq_45906596的博客 1600

安卓中的事件分发机制源码解析

安卓中的事件分发机制主要涉及到两类控件,一类是容器类控件ViewGroup,如常用的布局控件,另一类是显示类控件,即该控件中不能用来容纳其它控件,它只能用来显示一些资源类容,如Button,ImageView等控件。暂且称前一类控件为ViewGroup类控件(尽管ViewGroup本身也是一个View),后者为View类控件。

(* ̄︶ ̄) 8万+

安卓View—事件分发机制(二)

安卓View—事件分发机制 文章目录安卓View—事件分发机制一、基础知识1.事件分发是什么2.点击事件的传递规则3.事件分发的顺序二、事件分发源码分析1.Activity对点击事件的分发过程2.ViewGroup对点击事件的分发过程3.View对点击事件的分发过程三、事件分发总结 一、基础知识 1.事件分发是什么 事件分发就是对MotionEvent事件的分发过程,即当一个MotionEvent...

睡客的博客 1752

Android 事件分发机制

Android 事件分发机制 文章目录Android 事件分发机制前言Android 事件分发中的事件是什么?Android 事件分发是什么?为什么会有事件分发机制?事件分发里面重要的三个方法事件分发讲解Activity 的事件分发ViewGroup 的事件分发。View 的事件分发关于事件分发的总结 前言 Android 分发机制是每个 Android 开发者所要必须了解的知识点,了解了分发机制...

Sean_css的博客 518

了解Android中的事件分发机制

事件分发的对象是点击事件(Touch事件),当用户触摸屏幕时,将产生点击事件。这些事件包括ACTION_DOWN(按下)、ACTION_MOVE(移动)、ACTION_UP(抬起)和ACTION_CANCEL(取消)等类型。同一个事件序列指从手指刚接触屏幕,到手指离开屏幕的那一刻结束,在这一过程产生的一系列事件,这个序列一般以down事件开始,中间含有多个move事件,最终以up事件结束。事件分发的本质,其实就是将点击事件(MotionEvent)传递到某个具体的View处理的整个过程。

Good_tea_h的博客 1306

Android Touch事件分发机制

dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。 onTouchEvent方法用于事件的处理,返回true表示消

danfengw的博客 1148
上一篇: json解析
下一篇: EditText输入文字带下划线的效果
wangpanbaoding
博客等级 码龄18年 42粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值