Android--View事件传递

Android--View事件传递

View事件传递首先要明白以下要素:

  1. 事件就是MotionEvent.该对象包含了传递的事件中的所有信息
  2. 事件的来源是Window(即PhoneWindow),包含window的是Activity.所以可以认为事件的源头是Activity
  3. 对事件的操作包括:
    1. 分发, 通过dispatchTouchEvent()分发
    2. 拦截, 通过onInterceptTouchEvent()拦截
    3. 消费、处理, 通过OnTouchListener接口的onTouch()方法监听处理(有限处理监听),通过onTouchEvent()方法处理,先过onTouch,onTouch消费事件则不过onTouchEvent,onTouch方法不消费事件,则过onTouchEvent
  4. 对事件消费处理的函数:返回true表示消费掉,false表示不消费
  5. 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,事件都是以 ACTION_DOWN 开始 ACTION_UP 结束,回传的事件是一个事件序列,从ACTION_DOWN到ACTION_UP。必须先消费ACTION_DOWN,才能消费后续的动作,否则后续任何动作都不会被消费!
  6. 子View可以利用父View的requestDisallowInterceptTouchEvent方法不允许父View拦截事件

基于对以上要素的认识。就可以分析事件分发的流程。

事件分发流程

  1. 事件的源头从Activity的dispatchTouchEvent方法传递进来,默认Activity总是不消费事件的。所以事件交给PhoneWindow的superDispatchTouchEvent()方法。
  2. PhoneWindow把事件传递给DecorView(这是界面的根ViewGroup)的superDispatchTouchEvent()方法。
  3. DecorView按照父类ViewGroup的superDispatchTouchEvent方法处理事件
  4. 事件在没有被拦截和消费的情况下会逐次传递到下一级的View
  5. 最后一级的View的onTouchEvent方法会消费掉事件返回true

上面是没有事件拦截的情况。当然事件在从父一级传递到子一级View的时候,父View可以通过onInterceptTouchEvent()拦截事件,停止向下传递。

如果出现最后一级的View没有消费掉事件(OnTouchListener接口的onTouch()方法监听返回false,onTouchEvent()方法返回false),那么事件会依次向父view一级传递。这时候父View一级的onTouchEvent会被调用,要消费就返回true,不消费就返回flase。

如果各个层级的View都不消费事件,那么最后事件会返回到Activity,交给Activity的onTouchEvent方法。

转载于:https://www.cnblogs.com/zharma/p/8371122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值