【解疑答惑】—— Android事件传递机制之案例分析

android中使用startActivityForResult回传数据(详解) 在使用新浪微博APP时,能发现在微博发布界面进入图库选择图片后,会回到微博发布页面并带回了图片选择页面的图片信息。由于这种需求十分常见,因此,Android提供了一个startActivityForResult()方法,来实现回传数据。 要求:页面1跳转到页面2,页面2再返回页面1同时返回数据 页面1添加如下代码:  Intent intent = new Intent(); 阅读详情

Touch事件的传递

Android中的每个ViewGroup的子类都有三个与TouchEvent处理相关的方法

(其实也并不是所有的View的子类,好多教程上说是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView,本身就是一个最小的View,就不可能向它的子视图分发了,它也没有子试图,所以它没有dispatch,intercept,只有touchEvent)

  1. public boolean dispatchTouchEvent(MOtionEvent ev) 用来派发TouchEvent
    • 如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
    • 如果 return false,事件分发分为两种情况:(总之就是返回其上级处理)
      • 如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
      • 如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
    • 如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
  2. public boolean onInterceptTouchEvent(MotionEvent ev) 用来拦截Touchevent
    • 如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
    • 如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
    • 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
  3. public boolean onTouchEvent(MotionEvent ev) 用来处理TouchEvent
    • 如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
    • 如果返回了 true 则会接收并消费该事件。
    • 如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。

案例演示一

这里写图片描述
* UI有三层自定义的View叠加的,本质是LinearLayout,自定义的View中处理了一些日志打印;

  • 首先,最内层的View的Clickable属性设置为true;点击中心view控件后查看日志可以看到
    这里写图片描述
  • 这个操作ACTION_DOWN事件的处理流程如下图
    这里写图片描述
  • 解释:触摸事件发生后,系统调用Activity的派发touch事件的方法,传递touchevent,将此事件传递给外部控件的派发touch事件的方法处理,外部控件调用拦截touch事件的方法判断是由自己处理还是继续分发给子View,这里外部控件不处理Touch事件,根据坐标传递给外部View的子View也就是中间的View,
    中间层View和中心层View处理过程和上面一样,传递到中心层的interceptOutochEvent时,其属性Clickable为True表示其要处理Touch事件,所以中心View拦截事件将方法传递给自己的onTouchEvent方法,touch事件就不会被传递了

案例二

  • UI和上面一样,只是不指定谁去处理Touch事件,代码少了中心层View的clickable=”true”,显示日志如下:
    这里写图片描述
  • 这个操作ACTION_DOWN事件的处理流程如下图
    这里写图片描述
  • 解释:流程处理是和上个案例一样的,只不过在传递过程中没有一个View去处理这个touch事件,所以层层逆向传递回到Activity;
  • Down事件如此,一个Down事件确定了Activity的处理touch事件的方法,对于后面的move和up方法都会直接由activity处理

总结:

  1. Touch事件返回true,自己消费这个Touch事件;返回false表示自己不处理事件,继续传递
  2. 事件传递的两种方式:
    • 隧道方式:由根元素往下传递直到最内层元素或者在中间某一元素中由于某一条件停止传递
    • 冒泡方式: 从最内层的子元素依次往外传递直到根元素或者中间某一元素由于某一条件停止传递。

通俗讲解

话说一家软件公司,来一个任务,分派给了开发经理去完成:

开发经理拿到,看了一下,感觉好简单,于是

开发经理:分派给了开发组长

开发组长:分派给了自己组员(程序员)

程序员:分派给了自己带的实习生。

实习生:好苦逼,无法分派,怎么办啊?只能自己干了

但是实习生能不能做好,有两种情况了。

情况一:

实习生:经过一段时间的研究,琢磨,熬夜,奋斗,死敲,皇天不负有心人啊,完成了。

后来又来一个类似的任务,也按着这样传递下去了(开发经理->开发组长->程序员->实习生),又有实习生完成了。

情况二:

实习生:经过一段时间的研究,琢磨,就是毫无头绪,无法完成,只能求教师傅(程序员)了。

程序员:啊,我怎么没留意就给实习生搞了,这任务好难啊,自己研究下,也没有头绪,没办法只能请求组长了。

开发组长:这任务不难啊,怎么我底下的人都不会了,没办法,只能自己搞了,经过,一段时间,完成了,感想,以后要是又有跟这个很类似的任务,我就自己弄了,不给他们弄了。

后来又来一个类似的任务,传递是这样的

开发经理:分派给开发组长

开发组长:啊,又是跟着上一个很类似的任务,我自己弄吧,没过多久也完成了!
【解疑答惑】—— SurfaceView播放视频 来回切换出现ANR 项目中有用到SurfaceView 做视频播放,但是一直有一个问题,测试哥们今天又重新提了,貌似上任开发者并没有解决,看看吧。。。 自己试了试,确实是有这样的bug,但是是报ANR,奇了怪了,全屏放大不至于会报ANR啊,看了看代码,发现全屏播放实际是创建了一个包含surfaceView新的activity,也就是又创建一个SurfaceView,搞不懂为什么这么设计,orz…. 首先,看一... 阅读详情

相关推荐

关于使用javascript实现点击一个页面文本框,然后跳转到另一个页面进行点击值回传例子

NULL 博文链接:https://back-888888.iteye.com/blog/1048180

案例讲解安卓的事件传递机制

首先关于安卓的事件传递机制我们需要知道一些东西: View的继承关系,有关事件的几个方法: 跟Touch事件有关的处理方法主要有三个: //分派事件 public boolean dispatchTouchEvent(MotionEvent ev) //拦截事件 public boolean onInterceptTouchEvent(MotionEvent ev) //处理事件

淮左明都的博客 496

【AI方案集】AI与人机协作相结合的智能法律咨询系统.docx

AI技术方案以算力、算法、数据三角协同为核心,通过搭建标准化的数据预处理、模型训练与边缘云端协同部署流程,将计算机视觉、自然语言处理、机器学习等核心能力深度融入业务场景,既实现自动化流程降本提效,又通过精准的模式识别与预测分析为管理层提供数据驱动的决策支撑,最终完成从通用AI技术到行业定制化场景的适配落地,为企业数字化转型提供可落地的技术路径。

android中使用startActivityForResult回传数据

1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)。 Intent intent=new Intent(); intent.setClass(A.this, B.class); Bundle bundle=new Bundle(); String str1="aaaaaa"; bundle.

qq1028850792的专栏 2812

MobaXterm终端工具个人学习版安装包及常用配置备份

资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

【解疑答惑】—— android:maxLines="1"没满一行显示省略号,用android:singleLine="true"解决

带标签的文本 android:maxLines=”1”, 还没满一行就会会显示省略号 android:singleLine=”true”, 正常显示 问题原因:Google Document 的解释:android:maxLines Makes the TextView be at most this many lines tall. android:singleLine Constrains

android_ErChen的开发之路 3006

科技中介服务机构如何借助平台提升技术撮合服务的专业性与响应速度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【解疑答惑】—— Android调用系统相机,onActivityresult()回调接收到data为空

昨天调用系统相机拍照制作头像的时候遇到个问题,相机拍完照后返回后直接闪退,那么问题出在哪呢?先看看当时的代码: Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE"); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri()); cam...

android_ErChen的开发之路 1967

产业园区如何利用AI技术提升科技成果转化服务的响应速度与转化成功率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

11232131231231是的

11232131231231是的

【解疑答惑】—— AsyncTask的cancel方法失效的原因

问题描述: 当我们退出Activity的时候,AsyncTask可能还在执行 我们想在activity退出,关闭AsyncTask,想到了它的cancel()方法 参数为true的时候,AsyncTask中的线程正在运行也要被关闭;false等到线程执行完再取消 但是事实证明,调用这个cancel方法并没有关闭Asynctask 那么问题就来了,既然叫cancel为什么不能取消Asynctask呢

android_ErChen的开发之路 1339

基于双向Buck-Boost电路的锂电池储能充电+放电控制Simulink仿真

内容概要:本文档详细介绍了一种基于双向Buck-Boost电路的锂电池储能系统充放电控制的Simulink仿真模型,重点实现了充电与放电过程中双向能量流动的精确控制。通过Simulink平台构建完整的电路拓扑与控制系统,采用电压、电流双闭环控制策略,有效提升了系统的稳定性与能量转换效率。文档不仅提供了详细的仿真建模方法,还结合参考文献增强了理论支撑,具有较高的科研与工程应用价值。此外,文中列举了大量电力电子领域的相关仿真资源,涵盖LLC谐振变换器、PFC电路、PWM整流器、状态估计等多种技术方向,形成了一个综合性强、覆盖面广的技术资料库,便于研究人员拓展学习和复用设计。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子系统设计的工程师。; 使用场景及目标:①研究锂电池储能系统的双向能量管理与高效充放电控制策略;②掌握基于Simulink的电力电子系统建模与闭环控制器设计方法;③为科研项目、毕业设计或工程开发提供可复现的仿真案例与技术支持。; 阅读建议:建议结合文档中提供的参考文献与外部资源链接,系统性地学习Buck-Boost电路的工作原理与控制理论,优先理解基础拓扑运行机制后再深入双闭环控制策略的设计与参数整定,同时可参照同系列其他仿真案例进行对比分析与拓展实践。

【解疑答惑】—— invalidate、postInvalidate的区别

共同点 两者都是刷新界面的方法 原理:将UI线程中之前旧的view删掉,重新创建一个view 区别 invalidate()只能在UI线程中调用,也符合主线程更新UI的原则 postInvalidate()可以直接在子线程中刷新UI,源码如下: /** *This method can be invoked from outside of the UI thread * onl

android_ErChen的开发之路 567

基于STM32的半导体制冷片温度控制

制冷片温度控制,温控范围15℃~45℃,本人菜鸡一枚,大佬绕路。 #include "stm32f10x_gpio.h" #include "relay.h" void relay_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ê...

大白兔的博客 9015

Tesla V100 在 Windows 下的驱动选择与模式切换实战

本文详细解析了Tesla V100专业计算卡在Windows系统下的驱动安装与模式切换实战。针对设备管理器识别但任务管理器“隐身”的常见问题,文章指出其默认TCC模式为纯计算设计,并指导用户正确选择数据中心或GRID驱动。核心在于通过注册表修改或驱动选择,在高效的TCC模式与便于监控的WDDM模式间切换,同时提供了nvidia-smi命令行监控与AI框架测试等稳定使用方案。

weixin_29247219的博客 1807

【解疑答惑】—— PullToRefresh 下拉刷新的时候再滑动,报IndexOutOfBoundsException

问题描述:PullToRefresh 上拉刷新的时候向下滑动,这时候可能会报IndexOutOfBoundsException;

android_ErChen的开发之路 539

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7114

【解疑答惑】—— ImageView的src和backgroud的区别

src和background的区别 在imageVIew的XML属性中有两个属性src和background src存放的是图片资源,background是背景 但是两者还是有一些区别的 首先两者在代码中设置图片的方法不同//background mImageView.setBackground(); mImageView.setBackgroundResource(); mImageView.s

android_ErChen的开发之路 528

医疗大模型实战——从零构建MedicalGPT全流程解析

本文详细解析了从零构建医疗大模型MedicalGPT的全流程实战。基于Qwen-7B模型与约195万条中文医疗数据,完整复现了增量预训练、监督微调与偏好对齐三大核心环节,并分享了如何在有限硬件资源下实现高效训练与部署,为开发者提供了可复现的医疗AI项目实战指南。

weixin_29193259的博客 553

项目管理——14规划绩效域论文套路

规划绩效域论文套路

Flee Elf 1153
上一篇: 【每周一题】—— 线程池
下一篇: 【解疑答惑】—— Android调用系统相机,onActivityresult()回调接收到data为空
zc2echo
博客等级 码龄9年 6粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值