文档章节

Android 事件分发

x
 xjfxjf
发布于 2016/07/27 19:28
字数 997
阅读 3
收藏 0
点赞 0
评论 0

 Android 的事件分发过程如下:

首先Android的事件会分发到Activity里面,然后再往View视图下面分发,在View视图里面,会先分发到父视图,再往子视图分发,全部流程如下:

首先会调用Activity的dispatchEvent方法,然后会调用ViewGroup的DispatchEvent()方法,这时候就要分几种情况讨论了,首先,事件分为Down,Move,Up事件,

1,假设父类不拦截事件,也不消费事件,即ViewGroup的onInterceptTouchEvent()返回false,而且ViewGroup没有实现OnClick()方法,也没有实现onTouch方法(或者onTouch方法有实现,但返回false,即不消费事件),也没有实现onTouchEvent方法(或者实现了onTouchEvent()但返回false,即代表不消费事件),此时,只讨论子view,子view也分两种,一种是可点击的(Button),另一种是不可点击的(TextView),此时再分两种情况讨论,

(1)可点击子view,这种View是默认可点击的,即默认onTouchEvent()方法默认返回true,即会消费任何事件,假设这种view有实现onTouch()方法,并且返回true,则事件会先分发到此处,并且不会继续往下分发,如果返回false,则事件会继续往下分发,则继续调用onTouchEvent()方法,假设有实现onClick方法,那么OnClick方法是在调用onTouchEventh后的up事件之后调用它的。

可点击的默认消费所有事件,假设这个子View是自定义的,并且继承可点击的view,如果在自定义它只消费Down事件,那么,剩余的事件会继续往这个view分发,但由于父类事件不拦截,不消费,那么Move事件会传到这个View,但他不消费之后,这个事件会直接调用Activity的onTouchEvent事件,up事件也是一样。

假设这个view消费Down事件和Move事件,那么up事件一样会传到这个View上,但UP事件由于不被消费,所以直接返回调用Activity的onTouchEvent方法,

假设这个View不消费Down,Move和UP事件,那么当事件传到这个View时,他会一步一步往上传给父控件,即调用父控件的onTouchEvent方法,由于父类默认不拦截,那么事件会逐步返回到Activity上,并且调用Activity的onTouchEvent方法,然后剩余的事件都不会往下传递了,都由Activity消费

由于继承可点击和不可点击的控件的事件传输是一样,都是由onTouchEvent的返回值控制,

2当父类ViewGroup拦截事件时,即onInterceptTouchEvent()方法返回true,那么事件疆全部由父类消费,不会传递到子类,此时事件会去调用它的onTouchEvent方法,假如消费Down事件返回true,那么接下来的事件都会去分发到这里,如果Move事件不消费,那么就会直接调用Activity的onTouchEvent方法,up事件也是,如果只消费Move事件,那么Down事件会传递到这个onTouchEvent里面,由于不消费,那么事件会逐步往上传递,最终传递到Activity的onTouchEvent里面。那么接下来的Move事件就不会传递下来,而是直接在Acitivty里面被消费。

 

3假设ViewGroup拦截Move事件,但不消费事件,那么当事件穿戴到子view时,如果子view消费

事件,那么接下来的事件也会分发下去,当遇到Move事件时,那么那个时间就会被ViewGroup拦截,并且调用ViewGroup的onTouchEvent,由于ViewGroup只拦截,不消费,那么事件会直接分发给Activity,即调用Activity的onTouchEvent方法。而接下来的up事件,即便ViewGroup拦截,也不会被ViewGroup消费,而是直接分发给那个消费Down事件的view。

4假设ViewGroup只拦截up事件,那么事件会直接分发给子view,而不是自己消费。

 

© 著作权归作者所有

共有 人打赏支持
x
粉丝 0
博文 2
码字总数 1194
作品 0
广州
Android 机制篇 - 事件分发机制超详解(🔥🔥🔥🔥🔥🔥🔥🔥)

Android 虽然不是四大组件,但其并不比四大组件的地位低(涉及面的广度和深入甚至比四大组件还复杂🔥)。而View的核心知识点“事件分发机制”则是不少刚入门同学的拦路虎(1、项目中处处遇...

Pepsimaxin
07/12
0
0
安卓自定义View进阶-事件分发机制原理

安卓自定义View进阶-事件分发机制原理 之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部...

猴亮屏
05/22
0
0
android事件分发机制总结

Android事件分发机制 在android 普通view(不包含ViewGroup)和activity中主要有一下两个方法处理事件: public boolean dispatchTouchEvent(MotionEvent ev) // 分发事件public boolean on...

亓斌哥哥
2014/10/08
0
1
Android中父View和子view的点击事件的执行过程

Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTIONDOWN->ACTIONMOV...

火云
2015/06/11
0
0
android 滑动事件冲突解决 Touch事件处理机制

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTIONDOWN->ACTIONMOV...

haman
2013/11/05
0
0
职责链模式之Android事件分发源码分析

1、职责链模式概述: 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直...

Tifkingsly
07/13
0
0
Android View绘制过程以及事件传递原理

一. 对于控件,Android中的测量方式 在Android中,控件绘制的步骤是 measure,layout,draw 一般来说,如果父布局的宽度和高度,内外边距位指定,那么,上面的方法可以简化如下 在android开发中...

IamOkay
2015/03/23
0
0
【Android】打造下拉放大效果

前言 在其他App上看到了这样的一个效果,感觉有点意思,于是决定实现一个类似的效果。 (其实是iOS的同学在是现功能的时候秀了一波操作) 效果大概是这样子的: UI看完后 “这个效果不错啊”...

带心情去旅行
06/19
0
0
ViewPager子View滑动事件冲突解决

事件分发:public boolean dispatchTouchEvent(MotionEvent ev) Android事件以隧道方式逐层向下传递。事件首先由dispatchTouchEvent方法分发,分发逻辑如下: return true;由该dispatchTou...

风过后
2015/08/23
0
3
Android控件TextView的实现原理分析

在前面一个系列的文章中,我们以窗口为单位,分析了WindowManagerService服务的实现。同时,在再前面一个系列的文章中,我们又分析了窗口的组成。简单来说,窗口就是由一系列的视图按照一定的...

Luoshengyang
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
40分钟前
9
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部