dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent分发拦截事件处理

简述

1.View对触摸事件的处理机制
2.ViewGroup对触摸事件的处理机制
3.android对触摸体系的概念
4.混合ViewGroup、View的分发拦截机制

1.View对触摸事件的处理机制

View中触摸事件方法有两个:dispatchTouchEvent、onTouchEvent
调用顺序为 :dispatchTouchEvent ——> onTouchEvent

public boolean dispatchTouchEvent(MotionEvent event) {

//省略......

    if (mInputEventConsistencyVerifier !=null) {
mInputEventConsistencyVerifier.onTouchEvent(event, 0);
    }

//省略......

if (!result && onTouchEvent(event)) {
result =true;
        }
}
//省略
......
return result;
}

2.ViewGroup对触摸事件的处理机制

ViewGrouop中触摸事件方法有三个dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
调用顺序为 :dispatchTouchEvent ——> onInterceptTouchEvent ——> onTouchEvent

// ViewGrouo源码分析
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(ev, 1); }

// 省略
..........

if (actionMasked == MotionEvent.ACTION_DOWN ||mFirstTouchTarget !=null) {
final boolean disallowIntercept = (mGroupFlags &FLAG_DISALLOW_INTERCEPT) !=0;
if (!disallowIntercept) {  // 如果返回false
intercepted = onInterceptTouchEvent(ev); // 方法传递
ev.setAction(action); // restore action in case it was changed
} else {
intercepted = false;
}

从源码可以看出来所有触摸事件的触发都是在 dispatchTouchEvent 方法开始的,如果对源码感兴趣的同学可以去看一下哦!

3.android对触摸体系的概念

在android中对触摸事件有两个概念:分发、拦截

注意:在UI中,对触摸事件的处理是从父类开始执行的,首先执行了父类的dispatchTouchEvent 才会去执行子类的 dispatchTouchEvent,遵循先父后子的原则


分发

分发可以理解为传递的意思,是触摸view之后所传递执行事件方法的一种机制: 
       view: dispatchTouchEvent 方法分发给 onTouchEvent 方法
       viewGroup :dispatchTouchEvent 方法分发 给onInterceptTouchEvent方法分发 给 onTouchEvent 方法

分发机制就是调用dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent方法的时候返回值为false

分发可以事件对本身的分发,也可以是向下View(ViewGroup)分发

拦截

拦截可以理解为对该事件停止向下View(ViewGroup)或本身传递触摸事件

拦截机制就是对调用dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent方法的时候返回值为true

拦截事件之后,就不再向下传递消息机制了

混合ViewGroup、View的分发拦截机制

举个例子说明一下。看图

分发拦截机制图

图中有四个View:View A、View B、View C、View D
其中View B和View D是view,View A和View C是ViewGroup

接下来我们对该试图进行触摸事件操作:

1、从 View A 视图开始操作:

我们对 A 试图进行操作,系统首先会调用 dispatchTouchEvent 方法,判断该返回值。如果是 true 则拦截事件,剩下的方法都不会被调用,如果是 false ,则会调用 onInterceptTouchEvent 方法判断返回值。如果是true,则会调用 A 中的 onTouchEvent 方法,如果是 false 则会判断被触摸发该区域是否有子view,发现没有,则同样会调用 A 的 onTouchEvent 方法。


2、从 View B 试图开始操作

我们对B试图进行操作,因为 B 的存在父试图 View A,所以首先android系统会先调用 A 的 dispatchTouchEvent 方法,在该方法进行判断返回值。如果返回 true,剩下的方法不会执行,返回 false,则会调用 A 的 onInterceptTouchEvent方法,判断返回值。如果为true,则调用 A 的 onTouchEvent 方法,如果为 false,则会调用 View B 的 dispatchTouchEvent  方法进行判断,如果返回true,剩下的方法不会调用,直接返回 View A中的  onTouchEvent 方法,如果返回false,因为View B 是 View ,没有 onInterceptTouchEvent  方法,所以直接会调用 onTouchEvent 方法,判断返回值。如果返回true,说明该事件已经被处理,如果返回false,则会调用 父View A 的 onTouchEvent  方法。


机制都是以false处理的

3、从 View C 视图开始操作

首先会调用 A 的 dispatchTouchEvent 方法,true剩下的方法不会调用,false调用 A 的 onInterceptTouchEvent 方法判断。true调用 A 的 onTouchEvent  方法,false 调用 C 的 dispatchTouchEvent 方法判断返回值。true返回 A 的 onTouchEvent  方法,false调用 C 的 onInterceptTouchEvent  方法判断。true返回 A 的 onTouchEvent  方法,false调用 C 的  onTouchEvent  方法判断。true调用 A 的onTouchEvent  ,false 先判断该视图是否有子View,有就分发机制给子view,没有就返回 A 的 onTouchEvent  方法。


机制都是以false处理的

4.从 View D 试图操作

首先执行 3 的操作到 View C试图分发机制到 View D 的 dispatchTouchEvent 方法,true就处理完事件处理返回 View C 的 onTouchEvent  方法再返回到 View A 的onTouchEvent  方法,false 就先返回到 View C  的onTouchEvent  方法再返回到 View A 的 onTouchEvent   方法。


机制都是以false处理的

有兴趣的同学可以试一下哦

源码


我说的不是很清晰,希望大神看到可以指正错误

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

推荐阅读更多精彩内容