安卓技术-Touch事件传递
2020-02-16 本文已影响0人
七色瑾林
一、事件回调
- Activity-ViewGroup-View,dispatchTouchEvent-onTouchEvent。
其中,ViewGroup中还包含onInterceptTouchEvent。 - 返回false(部分需要super)则事件继续传递,返回true拦截事件,都是。
- View的onTouchEvent默认返回true,除非不可点击(clickable),因为点击和长按的判断需要消费事件。
注:事件与enable无关,即是否enable都不影响事件传递。
二、事件流程
缩写:
d:down
m:move
u:up
A:Activity
G:ViewGroup
V:View
D:dispatchTouchEvent
I:onInterceptTouchEvent
T:onTouchEvent
1. 不拦截(View也是返回false)
d: AD-GD-GI-VD-VT-GT-AT
m/u:AD-AT
说明:不拦截down事件,则move/up事件不会继续向下传递,直接由Activity消费。
2. Touch拦截(消费)
ViewGroup拦截:
d: AD-GD-GI-VD-VT-GT
m/u:AD-GD-GI-GT
View拦截:
d: AD-GD-GI-VD-VT
m/u:AD-GD-GI-VD-VT
说明:Touch拦截将消费事件,即事件不再传递,且move/up事件将直接传递给消费down事件的组件。
3. Intercept拦截
d: AD-GD-GI-GT-AT
m/u:AD-AT
说明:Intercept拦截会停止事件分发并改变事件传递方向,使事件立即反向传回。
如果GT消费了事件,则m/u直接AD-GD-GT,不会再经过Intercept拦截。
另外,onTouchListener优先于onTouchEvent,即前者如果消费事件,则后者不会受收到。
4. dispatch拦截
d/m/u:AD/AD-GD/AD-GD-VD
说明:dispatch拦截,将会立即终止事件分发,包括后续的事件。
dispatch很特殊,默认是返回true的,即拦截事件需要返回false。
另外,该方法必须super,否则事件无法分发。
实际上,intercept就是在dispatch中调用的。