Android 事件分发

Android 事件分发:

一、事件分发:

事件:当触摸View ViewGroup派生的控件后,将会触发一系列的触发响应事件

分发:是指一个触摸或点击的事件发生,分发给当前触摸控件监听的事件,进而决定是控件的那个函数来响应此次事件

二、事件作用的对象:

       Android的两大基础控件类型: View  ViewGroup:

      View :一般类型的控件 TextView Button Edittext等;

      ViewGroup :组合式控件,LinearLayout RelationLayout 等;

      ViewGroup : 继承View;

三、事件的分类:  

 事件通常重要的有如下三种:

    MotionEvent.ACTION_DOWN 按下View 是所有事件的开始

    MotionEvent.ACTION_MOVE    滑动事件

    MotionEvent.ACTION_UP 与DOWN对应 表示抬起

四、 Touch事件:

    Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理;

    Activity 对应的事件只有:dispatchTouchEvent、onTouchEvent;

    ViewGroup的相关事件有三个:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent;

    View的相关事件只有两个:dispatchTouchEvent、onTouchEvent;

 五、方法的流程:

        Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。

   1.  dispatchTouchEvent 的事件分发逻辑如下:

如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;

如果 return false,事件分发分为两种情况:

如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;

如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的  onTouchEvent 进行消费。

如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法

    2.  onInterceptTouchEvent 的事件拦截逻辑如下:

  在外层 ViewGroup 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 ViewGroup 的 onInterceptTouchEvent 方法。

如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;  

如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;

如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认不会被拦截,并将事件向下传递。

3.onTouchEvent 的事件响应逻辑如下:

      在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 情况下 onTouchEvent 会被调用。

如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。

如果返回了 true 则会接收并消费该事件。

如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。

六、事例Dome运行结果分析:

1.默认条件:  

 分析:  onInterceptTouchEvent 返回默认值是 false     onTouchEvent 返回默认值是true

 遵循了隧道传递方式,由最内层依次传递到最外层,如果没有字View没有处理返回父类处理;

2.1 Activity  dispatchTouchEvent  返回false 

    分析: 没有父类,事件就没有在向上传递处理

 2. 如果将dispatchTouchEvent 返回值设置为 true  

          分析:结束事件的分发, 并且有自己的dispatchTouchEvent方法处理;

3.1  activity dispatchTouchEvent 默认:      

  ViewGroup dispatchTouchEvent  false

分析:  ViewGroup 将分发事件返回false 不在向子类进行事件的分发,ViewGroup的触摸事件来自Activity,那么就会将Touch事件上传给Activity的 onTouchEvent 方法处理(即使将ViewGroup 的onInterceptTouchEvent事件的返回值设置为true 同样是不会处理的)

3.2   如果将ViewGroup dispatchTouchEvent 放回值设置为true:

分析:此时Touch事件就有自己的 dispatchTouchEvent 方法消费, 其它方法都不在执行, 

                (即使将ViewGroup 的 onInterceptTouchEvent onTouchEvent 返回值改变结果都保持不变)

4.1  activity  默认条件

ViewGroup dispatchTouchEvent 返回 默认

onInterceptTouchEvent 返回  true(默认)

  分析: 当ViewGroup的onInterceptTouchEvent 返回值设置为 true 时,那么就会拦截Touch事件,即使分发是默认的向下分发,此时也不会再向下分发事件,由于ViewGroup的onTouchEvent 事件默认是false 不处理,因此将Touch事件返回给Activity进行处理;

 4.2  如果 将 ViewGroup的onTouchEvent 返回值设置为true:

此时ViewGroup 不仅拦截了事件,而且处理了事件

5.1   activity  默认条件

ViewGroup  所有方法都返回默认状态

View的 dispatchTouchEvent 返回值设置false

分析: 由于View的dispatchTouchEvent返回的是 false ,因此会将Touch事件上传给父类处理,由于ViewGroup的onTouchEvent放回的是false ,ViewGroup就不会再处理该事件,在上传给Activity进行处理  

5.2  如果将ViewGroup onTouchEvent方法设置为true结果如下:

如果ViewGroup的onTouchEvent方法的返回值设置true 那么ViewGroup就会处理掉该事件;

 6.1   activity  默认条件

ViewGroup  所有方法都返回默认状态

    View的 dispatchTouchEvent 返回值设置true

分析:View 的 dispatchTouchEvent 放回true 那么Touch事件将由自己的dispatchTouchEvent消费

6.2  如果将View 的dispatchTouchEvent 设置为默认状态,并将View的onTouchEvent 事件返回值设置为false 结果为下:

事件由View的父类处理




总结:

View  Activity  只有dispatchTouchEvent  onTouchEvent 方法

ViewGroup 及其子类有 dispatchTouchEvent interceptTouchEvent  onTouchEvent 方法

dispatchTouchEvent    super 分发   true/false 不分发

onInterceptTouchEvent   super/false  不拦截   true拦截

    onTouchEvent super/true  消费时间   false 不消费事件

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

推荐阅读更多精彩内容