一点见解: Android事件分发机制(一)

一点见解: Android事件分发机制(一) - 基本概念解释
一点见解: Android事件分发机制(二) - 分析ViewGroup
一点见解: Android事件分发机制(三) - 分析View

本文是整个事件分发机制分析系列的第一篇, 主要目的是解释事件分发机制当中涉及的组件和概念.

意义

事件分发机制解决的问题是在Android视图组件间传递用户在设备屏幕上的操作, 例如点击, 滑动等.

任何操作都离不开事件分发机制, 了解事件分发机制可以更好地实现复杂的交互操作和更好地分析特殊操作源码.

事件(MotionEvent)

虽然分发机制的目的是传递用户在屏幕上的操作, 但是Android不会直接传递一整个操作

系统会把用户的操作分解成一系列的事件, 然后逐个传递这些事件. 事件可以看作是用户操作过程的节点, 每次分发只会分发一个事件.

例如一个滑动操作一般划分为: 手指接触屏幕 --> 移动手指(多个) --> 手指离开屏幕. Android事件分发机制所传递的就是这些分解之后的事件(手指接触屏幕, 移动手指, 手指离开屏幕).
Android里代表这些事件的是MotionEvent, 在大部分事件分发机制中涉及的方法里面都包含一个MotionEvent实例, 例如View.OnTouchListener#onTouch(View v, MotionEvent event). 这个实例包含了当前传递的事件的所有信息, 最常用到的是事件的触点位置(就是手指的位置)和事件类型.

其中最重要的就是事件类型了, 就是打开源码就能看到的各种ACTION_XXX, 所以之后都会用ACTION_XXX来表示一个事件.

其中在事件分发机制里面最常出现的有

  1. ACTION_DOWN : 代表手指首次接触屏幕, 所有的操作的第一步都是接触屏幕, 所以事件分发的第一个事件总是ACTION_DOWN.
  2. ACTION_MOVE : 代表手指在屏幕上移动, 是一个操作的中间状态, 是区分不同操作的关键, 也是视图控件主要关注的事件类型, 因为就是靠ACTION_MOVE来区分一个操作是点击还是滑动.
  3. ACTION_UP : 代表手指离开屏幕, 所有操作的最后一步都是离开屏幕, 所以事件序列里面最后一个事件分发的总是ACTION_UP.
  4. ACTION_CANCEL : 代表事件传递被中断, 因为事件分发还存在消费的概念, 这是后面需要解释的, 所以会出现事件传递不完整的情况, 需要通过ACTION_CANCEL来通知控件, 后面的事件没你份了.
  5. ACTION_POINTER_UPACTION_POINTER_DOWN : 代表有另一个手指接触/离开屏幕, 用来处理多点触控的情况.

注意, 传递事件和接收事件是有区别的, 这里说的传递是指系统传递给app的事件, 但是对于控件来说, 它不一定能接收到所有事件, 也就是说对控件来说它接收到的第一个事件不一定是ACTION_DOWN, 最后一个事件也不一定是ACTION_UP/ACTION_CANCEL.

事件是通过控件一层层往下传递的, 对控件来说, 它能接收到什么事件是由上一级控件决定的.

消费(Consume)

消费是指某个事件被某个控件"消耗"掉了.

事件被消费代表着这个事件(不是整个操作)不应该继续传递给下一个控件了.

在分发机制涉及的方法里面很多方法的返回值都是boolean类型, 例如View.OnTouchListener#onTouch(View v, MotionEvent event). 这个值就是标记该事件是否被消费了.

分发对象

事件分发机制的目的是在控件间传递事件, 那么分发的对象自然是控件了.

控件即是分发者也是分发对象.

所以最基本的分发机制逻辑就包含在控件的基类当中. 所以分析事件分发机制的关键就是分析两大控件的相关代码实现, ViewViewGroup.
值得指出的是, ViewGroup也是继承自View, 所以需要注意它们的具体实现的差别.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容