type
status
date
slug
summary
tags
category
icon
password

1 事件

事件分发的”事件“是指什么?
答:点击事件(Touch事件)
。具体介绍如下:
notion image
此处需要特别说明
:事件列,即指从手指接触屏幕至手指离开屏幕这个过程产生的一系列事件。一般情况下,事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件。
notion image

2 事件分发

notion image

3分发事件流程

现在假设我们有一个Activity渲染了一个布局,布局包括最外层的OuterViewGroup,内层的InnerViewGroup和最内层的控件View,现在我们点击这个View。
 
关于Down事件,Down的默认流程是通过dispatchTouchEvent从Activity依次分发到内部的View,在从View依次通过onTouchEvent将事件传递到Activity。
(1-1)默认流程:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent↓
onTouchEvent
←onTouchEvent
←onTouchEvent
←onTouchEvent
(1-2)在哪里拦截(方法返回true)流程就在哪里执行结束,例如在InnerViewGroup的dispatchTouchEvent返回true流程就是:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent
(1-3)在onInterceptTouchEvent中拦截时会跳过内部子child的流程,直接从该ViewGroup的dispatchTouchEvent进入到onTouchEvent,再逐层返回,例如在InnerViewGroup的onInterceptTouchEvent返回true
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent↓
onTouchEvent
←onTouchEvent
←onTouchEvent

关于Move和Up事件,Move和Up事件都是Down后产生的,因此他们的流程受Down影响。
(2-1)默认流程(不拦截):
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent↓
onTouchEvent
(2-2)在dispatchTouchEvent中拦截,与Down一样在哪里拦截执行到哪里,例如在InnerViewGroup的dispatchTouchEvent拦截:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent
(2-3)在onTouchEvent中拦截会直接跳过后面的child,例如例如在InnerViewGroup的onTouchEvent拦截:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent↓
onTouchEvent
(2-4)在onInterceptTouchEvent中拦截,根据(1-3)经过onInterceptTouchEvent拦截的Down事件会忽略child返回到Activity,整个流程类似默认流程,所以onInterceptTouchEvent拦截Move事件时,move事件只作用于Activity,例如在InnerViewGroup的onInterceptTouchEvent拦截
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent↓
onTouchEvent
(2-5)由此可见想在哪里拦截Move必须先让Move传递到那里,因此我们可以使用onInterceptTouchEvent和onTouchEvent组合的方式。例如在在 InnerViewGroup 中拦截onInterceptTouchEvent 和 onTouchEvent:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent↓
onTouchEvent
(2-6)在View的onTouchEvent拦截事件同时在InnerViewGroup中的onInterceptTouchEvent拦截Move事件:
Activity
OuterViewGroup
InnerViewGroup
View
dispatchTouchEvent→
dispatchTouchEvent→
dispatchTouchEvent↓
onTouchEvent
←onTouchEvent
Android基础-ANRAndroid基础-内存泄漏
LuluNotion
LuluNotion
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
🎉NotionNext 4.0即将到来🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏