1. 概念
是一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给链中的下一个对象,直到有对象处理它为止。
2. 使用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定;
- 在不明确指定接受者的情况下,向多个对象中的一个提交一个请求;
- 可动态指定一组对象处理请求,客户端可以动态创建责任链来处理请求。
3. 在Java/Android中的实际运用
- try/catch语句
- Ordered Broadcast
- ViewGroup/View时间传递
ViewGroup/View
1. 主要概念:
MotionEvent
事件 | 简介 |
---|---|
ACTION_DOWN | 手指 初次接触到屏幕 时触发。 |
ACTION_MOVE | 手指 在屏幕上滑动 时触发,会多次触发。 |
ACTION_UP | 手指 离开屏幕 时触发。 |
ACTION_CANCEL | 事件 被上层拦截 时触发。 |
ACTION_OUTSIDE | 手指 不在控件区域 时触发。 |
事件分发机制三个重要方法
1. dispatchTouchEvent
- dispatchTouchEvent是处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始执行
2. onInterceptTouchEvent
- onInterceptTouchEvent是ViewGroup提供的方法,默认返回false,返回true表示拦截。
3. onTouchEvent
- onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。
ViewGroup和View 的dispatchTouchEvent 是做事件分发,那么这个事件可能分发出去的四个目标:
- 自己消费,终结传递。——->return true ;
- 给自己的onTouchEvent处理——-> 调用super.dispatchTouchEvent()系统默认会去调用 onInterceptTouchEvent,在onInterceptTouchEvent return true就会去把事件分给自己的onTouchEvent处理。
- 传给子View——>调用super.dispatchTouchEvent()默认实现会去调用 onInterceptTouchEvent 在onInterceptTouchEvent return false,就会把事件传给子类。
- 不传给子View,事件终止往下传递,事件开始回溯,从父View的onTouchEvent开始事件从下到上回归执行每个控件的onTouchEvent——->return false;
ViewGroup和View的onTouchEvent方法是做事件处理的,那么这个事件只能有两个处理方式:
- 自己消费掉,事件终结,不再传给谁—–>return true;
- 继续从下往上传,不消费事件,让父View也能收到到这个事件—–>return false;View的默认实现是不消费的。所以super==false。
ViewGroup的onInterceptTouchEvent方法对于事件有两种情况:
- 拦截下来,给自己的onTouchEvent处理—>return true;
- 不拦截,把事件往下传给子View—->return false,ViewGroup默认是不拦截的,所以super==false;
2. ViewGroup的事件分发
ViewGroup事件分发流程
- 判断自身是否需要
- 自身不需要或者不确定,则询问ChildView
- 如果子ChildView不需要则调用自身的onTouchEvent
两个小问题
1. ViewGroup中可能有多个ChildView,如何判断应该分配给哪一个?
- 可以遍历所有的子view,判断手指触摸区域,就分发给哪一个View。
2. 当该点的ChildView有重叠时该如何分配?
- 当ChildView重叠的时候,一般会分配给显示在最上面的childview。当然这里需要区分情景,其与ViewGroup的渲染机制有关。
3. view的事件分发
view的dispatchTouchEvent
View可以注册很多事件监听器
view的四个相关事件
1. 单击事件(onClickListener)
2. 长按事件(onLongClickListener)
3. 触摸事件(onTouchListener)
4. View自身处理(onTouchEvent)
事件的调度顺序:onTouchListener>onTouchEvent>onLongClickListener>onClickListener