Android 事件分发,分发机制

1. 基础认知

1.1 事件分发的对象是谁?

答:点击事件(Touch事件)

  • 定义
    当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)

Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象

  • 事件类型(4种)
事件类型具体动作
MotionEvent.ACTION_DOWN按下View(所有事件的开始)
MotionEvent.ACTION_UP抬起View(与DOWN对应)
MotionEvent.ACTION_MOVE滑动View
MotionEvent.ACTION_CANCEL结束事件(非人为原因)

 

  • 特别说明:事件列
    从手指接触屏幕 至 手指离开屏幕,这个过程产生的一系列事件

注:一般情况下,事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件,如下图:

1.2 事件分发的顺序

即 事件传递的顺序:Activity -> ViewGroup -> View

activity返回true时消费事件,viewGroup不再响应事件。

 

 

示意图

1.3 事件分发过程由哪些方法协作完成?

答:dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()

activity事件触发顺序:viewGroup->activity

11-29 16:32:42.067 16915-16915/com.administrator.mvpdome E/lgq: Activity=分发===11111111111111
11-29 16:32:42.068 16915-16915/com.administrator.mvpdome E/lgq: viewGroup=分发===ddddddddddddd
11-29 16:32:42.069 16915-16915/com.administrator.mvpdome D/lgq: viewGroup==拦截==iiiiiiiii
11-29 16:32:42.069 16915-16915/com.administrator.mvpdome I/lgq: viewGroup=触摸===tttttttttttttttt

activity事件触发顺序:view->activity

11-29 16:34:32.027 16915-16915/com.administrator.mvpdome E/lgq: Activity=分发===11111111111111
11-29 16:34:32.028 16915-16915/com.administrator.mvpdome E/lgq: Activity=触摸===11111111111111

 

ViewGroup事件触发顺序:view->viewGroup

11-29 15:28:45.515 10978-10978/com.administrator.mvpdome E/lgq: dispatchTouchEvent=分发===ddddddddddddd
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome D/lgq: onInterceptTouchEvent==拦截==iiiiiiiii
11-29 15:28:45.516 10978-10978/com.administrator.mvpdome I/lgq: onTouchEvent=触摸===tttttttttttttttt

ViewGroup事件触发顺序:viewGroup->viewGroup

11-29 15:28:45.515 10978-10978/com.administrator.mvpdome E/lgq: dispatchTouchEvent=分发===ddddddddddddd
11-29 15:28:45.515 10978-10978/com.administrator.mvpdome D/lgq: onInterceptTouchEvent==拦截==iiiiiiiii

1.4 onTouch()和onTouchEvent()的区别

  • 该2个方法都是在View.dispatchTouchEvent()中调用
  • onTouch()优先于onTouchEvent执行;若手动复写在onTouch()中返回true(即 将事件消费掉),将不会再执行onTouchEvent()

 

ViewGroup的dispatchTouchEvent是真正在执行“分发”工作,而View的dispatchTouchEvent方法,并不执行分发工作,或者说它分发的对象就是自己,决定是否把touch事件交给自己处理,而处理的方法,便是onTouchEvent事件,事实上子View的dispatchTouchEvent方法真正执行的代码是这样的

 

ViewGroup的onTouchEvent事件是什么时候处理的呢?当ViewGroup所有的子View都返回false时,onTouchEvent事件便会执行。由于ViewGroup是继承于View的,它其实也是通过调用View的dispatchTouchEvent方法来执行onTouchEvent事件。

 

在目前的情况看来,似乎只要我们把所有的onTouchEvent都返回false,就能保证所有的子控件都响应本次Touch事件了。但必须要说明的是,这里的Touch事件,只限于Acition_Down事件,即触摸按下事件,而Aciton_UP和Action_MOVE却不会执行。事实上,一次完整的Touch事件,应该是由一个Down、一个Up和若干个Move组成的。Down方式通过dispatchTouchEvent分发,分发的目的是为了找到真正需要处理完整Touch请求的View。当某个View或者ViewGroup的onTouchEvent事件返回true时,便表示它是真正要处理这次请求的View,之后的Aciton_UP和Action_MOVE将由它处理。当所有子View的onTouchEvent都返回false时,这次的Touch请求就由根ViewGroup,即Activity自己处理了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作154:代码之解析position 解决

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>日常请假</title><style>* {margin: 0px…

教程-上传应用公钥并获取支付宝公钥

教程-上传应用公钥并获取支付宝公钥 1. 点击签名验签工具右下角的“上传公钥”会打开支付宝开放平台网页&#xff0c;输入账号登录。&#xff08;建议使用IE或Chrome浏览器。) 2. 在“我的应用”中&#xff0c;选择要配置密钥的应用&#xff0c;点击“查看”。记录对应的APPID…

小程序 获取用户信息 openid 等

获取用户信息主要有两种方式 1、直接使用wx.getUserInfo获取一些基础信息。 在userInfo字段中&#xff0c;存在基础信息&#xff0c;比如下图&#xff1a; 2、在正常使用中&#xff0c;我们是需要获取openid的。需要用到wx.login方法。 调用微信小程序中的API接口获取code…

2.mysql优化---增删改优化

整理自互联网 补充知识点&#xff1a;操作数据语句优化的认识 通常情况下&#xff0c;当访问某张表的时候&#xff0c;读取者首先必须获取该表的锁&#xff0c;如果有写入操作到达&#xff0c;那么写入者一直等待读取者完成操作&#xff08;查询开始之后就不能中断&#xff0c;…

工作155:icon图标前置和后置

<el-button slot"append"></el-button> 里的 slot"append" 就是一个UI摆放的位置,其实就是封装的样式布局。 append&#xff1a;代表放在紧贴在依赖组件的后面prepend&#xff1a;代表放在紧贴在依赖组件的前面<el-form :model"for…

Edittext不可编辑可点击,输入密码可见与不可见,验证码换格输入实现方法,车牌号自定义输入键盘

不可编辑可点击&#xff1a;设置两个属性即可 mEdittext.setFocusable(false); mEdittext.setOnClickListener(this::onClick); 输入密码可见与不可见 private boolean ifonpenteyestrue; if (ifonpenteyes){ ifshowpawimage.setImageResource(R.mipmap.openeyes); l…

小程序button去除边框

在小程序给官方button增加自定义样式的时候&#xff0c;需要注意隐藏button的border。 我用的less&#xff0c;加上一行代码就可以解决。 &:after {border: none; }例如下图自定义样式的代码是 .login-btn {background: #ecb810;color: #2e2f2e;display: flex;align-ite…

Alpha 冲刺 (7/10)

队名&#xff1a;天机组 组员1友林 228&#xff08;组长&#xff09; 今日完成&#xff1a;get到了一份对winsock各功能封装好的代码明天计划&#xff1a;继续封装剩余任务&#xff1a;对接主要困难&#xff1a;头文件迷之出错收获及疑问&#xff1a;加深了c以及java类的理解本…

表单提交中的input、button、submit的区别

参考博文&#xff1a;http://www.cnblogs.com/shytong/p/5087147.html 设置typesubmit后&#xff0c;输入控件会变成一个按钮&#xff0c;显示的文字为其value值&#xff0c;默认值是Submit。form[method]默认值为GET&#xff0c;所以提交后会使用GET方式进行页面跳转。input[t…

小程序 authorize scope.userLocation 需要在app.json中声明permission字段

使用wx.authorize遇到的一个小问题&#xff0c;解决办法就是在app.json中增加permission字段。 官方地址&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html

【洛谷P3389】【模板】高斯消元

题目链接 题目描述 给定一个线性方程组&#xff0c;对其求解 输入输出格式 输入格式&#xff1a; 第一行&#xff0c;一个正整数 n 第二至 n1行&#xff0c;每行 n1 个整数&#xff0c;为a1, a2 .....an​ 和 b&#xff0c;代表一组方程。 输出格式&#xff1a; 共n行&#xff…

微信小程序上传的视频显示封面 我是阿里云oss的实现

我们一般用wx.chooseVideo拍摄视频或从手机相册中选视频&#xff0c;然后上传到后台存储空间。 但是给用户显示视频列表的时候&#xff0c;需要视频封面额。 阿里oss地址&#xff1a;https://help.aliyun.com/document_detail/64555.html?spm5176.11065259.1996646101.searc…

Android 仿微信多张图片选择器,适配android10系统,open failed: EACCES (Permission denied)

实现效果 只需引入模块&#xff0c;比起依赖&#xff0c;更方便自定义 implementation project(:imagepicker) //图片加载 implementation com.github.bumptech.glide:glide:4.11.0 初始化即可使用 private void initImagePicker() {ImagePicker imagePicker ImagePicker.g…

前端学习(2640):懂代码之登录页login.vue存入用户信息

<template><div class"login-wrap"><div class"ms-login"><div class"ms-title">后台管理系统</div><!--1定义参数类型 2定义路由规则 3使用ref去进行指向 --><el-form :model"param" :rules&…

js将字符串 YYMMDDHHmmss 转化为 date类型

微信支付的回调参数time_end为日期字符串。 需求&#xff1a;将20190523101156转化为转换为Date日期格式Thu May 23 2019 10:11:56 GMT0800 (中国标准时间) const str2date (dateString)> {const pattern /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;return new Dat…

This relative module was not found ./cptable webpack

在使用xlsx库的时候遇到的报错。 This relative module was not found: * ./cptable in ./node_modules/xlsx-style/dist/cpexcel.js记录解决方法&#xff0c;我是使用webpack进行配置的。 在chainWebpack里面增加一行代码&#xff0c;重新编译&#xff0c;即可。 config.ext…

工作155:首页样式调整第二次

<el-card><h1 style"float: left;margin-top: 34px;margin-left: 32px;">我的订单</h1><el-button size"mini" style"float: right;margin-top: 14px;margin-right: 10px;" type"primary" click"ListClick…

关于CaciiEZ端口流量阀值报警的设置

作者:邓聪聪 环境&#xff1a;CactiEZ v10.1 为了更高效的发现问题&#xff0c;在非工作期间&#xff0c;公司的网络可能会出现一些故障&#xff0c;为了及时解决问题&#xff0c;所以做了一个流量监控&#xff0c;并以邮件的方式发送流量异常的端口&#xff0c;以便及时了解状…

微信开发 getUserInfo:fail tunneling socket could not be established, cause=connect ECONNREFUSED

微信开发过程中&#xff0c;突然遇到一个奇怪的问题&#xff1a; 解决办法&#xff1a; 找到开发工具中 “工具 - 设置 - 代理设置”&#xff0c;选择即可不使用任何代理。