Android事件分发机制及其拓展

Android事件分发机制

        Android触摸事件的流动方向是从父视图到子视图,在父视图将事件传递给子视图之前,父视图会回调onInterceptTouchEvent方法,检查是否要拦截后续事件。如果拦截,子视图会收到cancel事件,将不会再收到任何后续事件,同时父视图的onTouchEvent方法将会收到后续事件。如果不拦截,该事件会分发给子视图。虽然父视图可以随时拦截事件,但子视图也可以禁止父视图拦截。子视图通过调用父视图的requestDisallowInterceptTouchEvent方法,可以禁止父视图拦截事件,那么子视图将会收到后续所有事件。

       down事件是一次完整Android事件流的起点,有其特殊性。一般的父视图不会拦截down事件,这样down事件会顺着视图层级,一直传达到最顶层子视图。这样就形成了一个链条,每个链条节点的上游是其父视图,下游为其子视图。当down事件到达链条末端的子视图时,它可以表达对此事件不感兴趣--在onTouchEvent回调中返回false,那么它将会被从这个链条中删除。若它对这个事件感兴趣,那么这个事件链条就成功建立了。所以在down事件的整个传递过程中,会初步建立这个事件传递链条。然而这个链条,会因为上游的父视图在onInterceptTouchEvent和onTouchEvent中同时返回true,而被切断。之后这个链条的末端节点就变成了该父视图。

Andoid事件分发机制的局限性

       从上文的事件链条,可以看出消耗事件的永远是末端节点,而上游的父视图,只是不断进行观察,以等待合适时机去切断链条。现在流行的界面设计,往往会采用视图联动的方式,反馈用户的手势动作。简单点说,就是当手指在A视图上滑动时,与A视图并不在同一事件链条中的B视图会联动。显然以往的事件分发机制并不能很好的满足这种交互需求,因为真正消耗事件的可能是多个视图。

Android事件分发机制的扩展

         Android在原有事件分发机制的基础上对其进行了扩展。扩展的方式是以原有末端节点的onTouchEvent方法为起点,进行了事件再分发。这种再分发并不包含原有分发机制中的拦截处理,可以说是一种相对简化的事件分发模型。从末端节点开始,它会向上寻找对触摸事件感兴趣的父视图,如果找到就会建立与该父视图的联系,需要注意的是寻找到的父视图不一定是直接父视图。整个过程大致如下:在该末端节点处理之前,它会先将事件交由该父视图进行预先处理;紧接着会根据父视图的处理情况调整自己的滚动策略;最后再次将自己处理后的事件交由父视图处理。为了便于理解,在此举例说明:用户手指在屏幕滑动了10个像素,子视图交由父视图处理,该父视图消耗了4个像素,或者说父视图向上移动了4个像素;子视图得知父视图消耗了4个像素,它可能也会消耗4个像素,就是向上移动4个像素;最后还剩余2个像素,子视图再次将事件交由父视图,父视图根据自身情况,选择是否消耗剩余像素。

        形象点说,用户手指移动,就像是在画一个饼。饼的大小是固定的,子视图和父视图通过协商去分这个饼。当然在分配的过程中切口要漂亮,就是说要达到协调一致的效果。比如,在一个垂直先行布局中有上下两个子视图,当手指滚动下方视图的时候,上方视图也应该协调滚动,以维持两个子视图的相对位置不变。

后记

          后续我可能会用实例去说明整个事件分发过程,选取也是相当典型的实例--CoordinatorLayout有两个子视图AppBarLayout和SwipeRefreshLayout,同时SwipeRefreshLayout有一个子视图--RecyclerView.当然,我确实不敢写这篇文章,因为太复杂了,更何况是要用文字清晰的表达。说白了,我怀疑我是否能把这其中的逻辑说清楚。

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

推荐阅读更多精彩内容