Android 事件分发机制

基础知识点:

对于触屏手机,我们在上面进行的任何点击、滑动,也就是触屏(Touch)活动,都会生成被封装到一种叫MotionEvent的事件里,Android系统用一下六种类型来描述用户的touch事件类型

ACTION_DOWN(按下)

ACTION_MOVE(屏幕滑动)

ACTION_UP(离开屏幕)

ACTION_POINTER_DOWN(多点触屏时产生,暂不讲解)

ACTION_POINTER_UP(多点触屏时产生,暂不讲解)

ACTION_CANCEL

MotionEvent里面包含丰富的数据信息,包括:Touch的位置(Touch location),Touch的触点数(也即手指数),Touch的时刻等等

一个完整的手势(gesture)是以action_down开始,以action_up结束

事件流:action_down--->action_move--->action_move--->action_move.....--->action_up(中间的action_move事件是否发生取决于手势是否发生移动)

想想你平常在桌面点击打开app和页面切换滑动时激发的事件流是否有所不同?

事件的分发,拦截,响应的机制(关键字:分发,拦截,响应,消费)

想象:想象一下贪官贪污的一种情况:在某某贫困县,每年国家都会给予一定的资金补助(分发过程),这笔钱(touch事件)经过省政府(根布局),市政府(父布局)都没人去贪污它(即没人去拦截它),那么这钱就继续往下分发,到了县政府这里来,此时某某县大领导(子view)想吃下这笔钱,那么他就不让这钱逃过他的手了,所以他进行了拦截,拦截下来后,就要对这钱进行“处理”呀,这时就进行了响应和消费,以后只要这官不被抓,那么每年国家拨下来的资金都分发到他这里就被拦截及消费了。当然还有另外一种情况(现实不大可能发生),就是整个过程没有人贪污,那么钱就一步一步分发下去,发到县以后,这些年贫困县发展起来了,决定不要这笔钱了(响应但不消费),所以就把钱还给市政府,市政府也决定不要这钱(响应但不消费),就又把钱交给省政府了

事件分发流程:从父布局到子布局:Activity--->RootView--->ViewGroup1--->ViewGroup1的子ViewGroup2 ---> Target View

事件的响应流程:从子布局到父布局:Target View--->ViewGroup2--->ViewGroup1--->RootView--->activity



几个规则:

所有的事件从activity的dispatchTouchevent()函数开始,从父布局到子布局往下分发,当然每个布局在任何事件传到它那里后都可进行拦截

所有的事件顺着界面布局层次往下分发,分发完就回溯(上面的分发和响应流程),这一过程中一旦出现了消费,流程就停在消费的view那一层,view必须把action_down事件消费掉后,后续的这个手势的其他的事件才会传到这个view。

如果整个过程没有view想消费这个事件,那么最终的回溯的结束点就是activity的onTouchEvent()。

几个涉及的重要方法(view或viewgroup里的方法):

public boolean dispatchTouchEvent(Motion ev):事件分发方法,把当前事件分发给下一子布局,是一个递归的调用函数,返回true则表示事件被处理

public boolean onInterceptTouchEvent(MotionEvent event):事件拦截方法,根据事件类型进行拦截,比如一个scrollview想拦截action_move这个事件,返回true则表示进行了拦截

public boolean onTouchEvent(MotionEvent event):事件响应处理方法,可以在方法中把事件消费了,也可不消费,那么就回溯给上级去响应和处理,返回true则表示事件被消费

整个分发和响应过程的规则可以用以下的伪代码(摘自《Android开发艺术探索》)表示:

public boolean dispatchTouchEvent(MotionEvent event){

     boolean consume=false;

     if(onInterceptTouchEvent(event)){

           consume=onTouchEvent(event);

     } else { 

           consume=ChildView.dispatchTouchEvent(event);

     }

     return consume;

}

以下根据实例讲述过程:本截图引用自全英文档http://trinea.github.io/download/pdf/android/PRE_andevcon_mastering-the-android-touch-system.pdf



讲解:此布局是在frameLayout里面嵌套一个普通的view,当你按下的时候,会触发down事件,事件就从activity出发,由于此时没有任何的布局对此感兴趣(即没拦截和消费),那么分发完后回溯会activity的onTouchEvent,后续发生的move和up事件,这时Android系统会这么认为:既然你整个布局所有组件连按下去的事件都不感兴趣,后续发生的事件肯定也是不感兴趣,所以事件move和up都不往下进行分发和回溯了,直接在activity自己调用onTouchEvent去处理


讲解:此布局是在frameLayout里面嵌套一个button,当你按下的时候,会触发down事件,事件就从activity出发,由于此时button对此事件感兴趣,那么button的onTouchEvent就会对此进行消费,事件被消费后就不会再回溯了,后续发生的move和up事件,button也是感兴趣,也进行了消费,所以整个流程就只走到了button的onTouchEvent方法


讲解:此布局是在Scrollview里面嵌套一个button,当你按下的时候,会触发down事件,事件就从activity出发,由于此时button对此事件感兴趣,而scrollView对此事件不感兴趣,那么button的onTouchEvent就会对此进行消费,事件被消费后就不会再回溯了,后续发生的move和up事件,scrollview和button都感兴趣,但是由于scrollview先拿到事件,进行拦截和消费,所以事件流就没走到button那里,那为什么还会走回activity的onTouchEvent呢,scrollview进行拦截,但不进行消费,也就是scrollview的onTouchEvent返回值是false,所以才会回溯给activity。

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

推荐阅读更多精彩内容