Android 责任链模式

1. 概念

是一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给链中的下一个对象,直到有对象处理它为止。

2. 使用场景

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定;
  2. 在不明确指定接受者的情况下,向多个对象中的一个提交一个请求;
  3. 可动态指定一组对象处理请求,客户端可以动态创建责任链来处理请求。

3. 在Java/Android中的实际运用

  1. try/catch语句
  2. Ordered Broadcast
  3. 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 是做事件分发,那么这个事件可能分发出去的四个目标:

  1. 自己消费,终结传递。——->return true ;
  2. 给自己的onTouchEvent处理——-> 调用super.dispatchTouchEvent()系统默认会去调用 onInterceptTouchEvent,在onInterceptTouchEvent return true就会去把事件分给自己的onTouchEvent处理。
  3. 传给子View——>调用super.dispatchTouchEvent()默认实现会去调用 onInterceptTouchEvent 在onInterceptTouchEvent return false,就会把事件传给子类。
  4. 不传给子View,事件终止往下传递,事件开始回溯,从父View的onTouchEvent开始事件从下到上回归执行每个控件的onTouchEvent——->return false;

ViewGroup和View的onTouchEvent方法是做事件处理的,那么这个事件只能有两个处理方式:

  1. 自己消费掉,事件终结,不再传给谁—–>return true;
  2. 继续从下往上传,不消费事件,让父View也能收到到这个事件—–>return false;View的默认实现是不消费的。所以super==false。

ViewGroup的onInterceptTouchEvent方法对于事件有两种情况:

  1. 拦截下来,给自己的onTouchEvent处理—>return true;
  2. 不拦截,把事件往下传给子View—->return false,ViewGroup默认是不拦截的,所以super==false;

2. ViewGroup的事件分发

ViewGroup事件分发流程

  1. 判断自身是否需要
  2. 自身不需要或者不确定,则询问ChildView
  3. 如果子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


参考

  1. 图解 Android 事件分发机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值