事件分发机制问与答

最近写的系列文章完全是为了通过自问自答的形式帮助自己理解相关的知识点,首先有个思维框架,然后再看源码会手到擒来,再者带着问题再去研究,有时候效果非常好。5w2h。
1:什么叫事件序列
基本的事件叫做MotionEvent,包含三种操作:
ACTION_UP:手指从屏幕上抬起来的一瞬间的操作
ACTION_MOVE:手指在屏幕上滑动的操作
ACTION_DOWN:手指按下屏幕的那一瞬间的操作
完整的事件序列包含两种:
点击事件:由一个ACTION_DOWN和一个ACTION_UP组成
滑动事件:由一个ACTION_DOWN、若干个ACTION_MOVE和一个ACTION_UP组成
2:事件是从哪里产生的?怎么个传递过程
事件是在activity里产生的,传递过程分为两个过程:
正向传递:从事件开始产生到事件分配到具体的view消费的过程,具体流程为:
activity–windows—decorView----常见的页面viewGroup----具体的view
逆向传递:事件传递到view时由于一些原因,比如onTouchEvent()反回了false,导致事件没有被view消费,事件会逆向传递回到activity.
3:事件的处理方法有哪些?
分配:dispatchTouchEvent()
拦截:onInterceptTouchEvent(),view没有这个方法
消费:onTouchEvent()
4:三种不同的元事件在被处理过程中,处理流程是不是一样的,有什么地方是特殊处理的吗?
不一样,在viewGroup的dispatchTouchEvent方法中,只会拦截ACTION_DOWN事件,因为如果拦截了ACTION_DOWN事件,整个事件序列都会被viewGroup拦截。如果没有拦截,如果ACTION_DOWN事件被view消费了会赋值mFirstTouchTarget,事件统一交给target处理。
在view的onTouchEvent方法中对ACTION_UP做了特殊处理,只有在ACTION_UP触发的时候,事件注册的clickListener才会生效。
5:事件是怎么被分发的?
viewGroup先进入dispatchTouchEvent()方法,在内部会调用OnInterceptTouchEvent判断是否进行拦截,如果不拦截则轮询子view,调用子View的dispatchToucheEvent方法,从而继续调用子view的onTouchEvent()来判断是否消费。如果拦截则调用viewGroup的OnTouchEvent()。如果子view的onTouchEvent()消费了事件,事件会被消费,否则事件会交给viewGroup处理。如果viewGroup的OnTouchEvent()消费了事件,事件会被消费,否则返回给activity处理。
6:滑动冲突怎么处理?
内部拦截法:交给子view处理,通过子view的requestDisallowInterceptTouchEvent方法来干扰父view的拦截功能。
外部拦截法:父view进行处理,在父view的onInterception根据逻辑需要做相应的拦截

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值