1,Activity,ViewGroup,View的关系
本文按层次比喻,ViewGroup与其中的View的关系不是父子,而是上下层。父子描述继承关系更准确些。
最下层是Activity,Activity上面是一系列ViewGroup,ViewGroup上面是View。
事件总是从Activity向上层传递。
2,触摸事件
一个手指在屏幕上触摸动作产生一组事件,其中常见的是 ACTION_DOWN,ACTION_MOVE...MOVE…MOVE、最后ACTION_UP。每一个事件都是从下层向上层传递。
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
3,传递事件时的重要函数
▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
它们在同一层调用顺序是 dispatchTouchEvent--->onInterceptTouchEvent --->onTouchEvent
只有ViewGroup有onInterceptTouchEvent方法,如下表:
方法 | Activity |
ViewGroup |
View |
public boolean dispatchTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
public boolean onInterceptTouchEvent(MotionEvent ev) | 无 | 有 | 无 |
public boolean onTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
它们的返回值含义或功能表如下:
方法\返值 | true | false | super.同名函数 | |
Activity | dispatchTouchEvent | 消费 | 消费 | 不消费,续传 |
onTouchEvent | 消费 | 消费 | 消费 | |
ViewGroup | dispatchTouchEvent | 消费 |
不消费,回溯 |
不消费,续传 |
onInterceptTouchEvent |
拦截 |
不消费,续传 | 不消费,续传 | |
onTouchEvent |
消费 |
不消费,回溯 | 不消费,回溯 | |
View | dispatchTouchEvent | 消费 | 不消费,回溯 | 不消费,续传 |
onTouchEvent | 消费 | 不消费,回溯 | 不消费,回溯 |
4,事件传递流程参考图
图中:
- 每条泳道是不同的处理类,
- 整个图是U型,绿色粗箭头。事件以Activity开始,也以它结束(所有人都没处理时,最后就由activity处理)。
- 细实箭头是返回true,虚线是返回false,粗线是返回super.XX同名方法。
- super.xxx是保证事件能继续传递的调用。是U型图的主线。
- dispatchTouchEvent、onTouchEvent返回true表示处理了事件。返回false都表示把事件传回前一层。
- 当down在某处被消费(返回true)后,后续的move,up就以短路径过去,不是按原路径。