安卓技术

安卓技术-Touch事件传递

2020-02-16  本文已影响0人  七色瑾林

一、事件回调

  1. Activity-ViewGroup-View,dispatchTouchEvent-onTouchEvent。
    其中,ViewGroup中还包含onInterceptTouchEvent。
  2. 返回false(部分需要super)则事件继续传递,返回true拦截事件,都是。
  3. 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中调用的。

上一篇 下一篇

猜你喜欢

热点阅读