View的事件分发机制

View的事件传递机制:
【1】事件分发

View:(如果不是ViewGroup类型,代表没有子View 所以需要将所有结果向爸爸报告)
public boolean dispatchTouchEvent(MotionEvent event) {
官方注解:
将触摸屏运动事件向下传递到目标视图,或者查看它是否为目标。

可以被重写 可以被其他对象调用

返回值代表 当前的View是否处理了这个事件

【1】事件应该首先被辅助性焦点处理,如果我们没有焦点或者没有虚拟的后代有焦点,那么我们应该不去处理这个事件(返回false)
【2】如果上面没有返回false,继续正常的处理流程

如果是ACTION_DOWN操作,停止正在进行的嵌套滚动
筛选触摸事件以应对安全策略,如果这个事件需要被分发那么返回true,否则应该丢弃
当窗口被遮挡的时候,就放弃这个触摸事件(onFilterTouchEventForSecurity),如果onFilterTouchEventForSecurity
返回的是false,那么最后的结果就是false,如果onFilterTouchEventForSecurity返回true,继续走下面的流程

如果当前view是可点的状态,然后当前如果通过鼠标输入控制滚动条拖动将事件作为滚动条拖动处理就是true否则就是false(handleScrollBarDragging),这个时候 返回true

如果可点击且消耗了这个事件 返回true

如果当前事件还没有被处理 然后 被touchevent处理了,返回true

如果当前是 ACTION_UP ACTION_CANCLE 或者 result = false 加上 ACTION_DOWN 那么就定制嵌套滑动

public boolean onTouchEvent(MotionEvent event) {
官方注解:
实现这个方法去处理触摸屏幕运动事件,不建议用来处理点击事件,如果事件被处理返回true,否则false

【1】判断当前的View是否可点
【2】不可点直接返回false
【3】如果委托不是null,然后在touchevent之后返回true,那么就返回true

什么是mTouchDelegate???
【4】如果可点击或者长按悬停有提示…..一系列操作之后,返回true
【1】ACTION_UP:
如果需要处理tooltip,那么就去处理
如果不可点,那么移除各种回调,将各种变量置为false,break

【5】以上都没有返回,最后返回false

ViewGroup:
dispatchTouchEvent
【1】过滤掉不符合安全策略的事件,窗口被遮住之类的
【2】如果当前是 ACTION_DOWN ,那么在开始一个新的触摸手势的时候,扔掉之前所有的状态,framework层由于app的切换,当前程序无响应或者一些其他的状态改变可能已经丢掉了ACTION_UP 或者 ACTION_CANCLE
【3】出现了检查拦截的对象intercepted
【4】当前是ACTION_DOWN而且触摸列表中第一个触摸目标不为null,那么我们先取的 是否允许拦截的对disallowIntercept,如果允许那么我们就调用自身的onInterceptTouchEvent,拿到返回结果赋值给intercepted,然后重新保存action,防止改变;如果不允许,那么就直接给intercepted赋值为false
【5】如果不满足以上条件,直接将intercepted设置为true
【6】如果没有被取消且没有被拦截
【1】如果事件的目标是可访问性焦点,我们将其提供给具有辅助功能焦点的视图,如果不处理它我们清除标志并像往常一样将事件分派给所有子级。我们正在查找以可访问性为中心的主机,以避免说明因为这些事件非常罕见。
【2】ACTION_DOWN
【1】找到一个可以接收事件的子view,遍历子View
【2】将孩子传给dispatchTransformedTouchEvent函数,判断如果当前需要cancle或者旧的动作需要cancle,我们将这个cancle设置给event,如果孩子是空的那么就调用父类View的dispatchTouchEvent,否则就调用孩子的dispatchTouchEvent
【1】将孩子或者自己调用View的dispatchTouchEvent结果返回
【3】如果返回结果是true也就是说已经被处理了,那么就跳出循环
【7】触摸列表中第一个触摸目标为null,就调用自己的函数dispatchTransformedTouchEvent,将参数child传为null,这样就是自己调用父类的dispatchTouchEvent方法
【8】不为null,从mFirstTouchTarget开始向后遍历,那么还是调用每个孩子的dispatchTouchEvent方法,如果有一个孩子处理过了,那么就直接复制为true

onInterceptTouchEvent
onTouchEvent

其实如果mIntercepted就是控制了是由viewgroup自己处理还是交给孩子

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

推荐阅读更多精彩内容