Android事件分发的注意问题

在这里插入图片描述

dispatchTouchEvent

只有返回super的情况下才会向下分发,分发的情况为:

Activity调用viewGroup的dispatchTouchEvent;

viewGroup 会调用自身的onInterceptTouchEvent();

然后再调用view的dispatchTouchEvent();

最后view 会调用onTouchEvent();

在这每个阶段,如果返回了true,直接消费掉,事件没有任何控件处理,认为这个事件是个费事件;
如果返回false,这个事件不再向下分发,而是调用父控件的onTouchEvent()方法,注意Acitvity会直接消费掉;

onInterceptTouchEvent

这个方法只有ViewGroup中含有,返回true拦截事件交给自身的onTouchEvent方法处理(一定要看注意第三条)
返回false和super会分发给子view的dispatchTouchEvent();

onTouchEvent();

返回super和false会调用父View的onTouchEvent方法,
返回true代表消费该事件

注意:

  1. 每一次touch产生的action事件,如果down事件在onTouchEvent()返回false,那么系统认为当前View不关心这一次的touch事件,此时这个action会传向父级,调用父级View的onTouchEvent。
    如果这个事件没有任何控件进行处理,那么这一次的touch事件之后发出的任何action(move up),该View都不会再接受,onTouchEvent在这一次的touch产生的action事件再也不会触发;但是如果我们对acition事件在dispatchTouchEvent方法消费了,那么后续的action事件仍能继续传递。只要走了onTouchEvent()并且返回了false那么后续的事件都不会接收到。

  2. 如果在ViewGroup的OnTouchEvent中down事件返回true,那么后续move、up不会走onInterceptTouchEvent,而是直接交给viewGroup自身的onTouchEvent来处理。也就是说父层已经截获了这次touch事件,之后的action也不必询问onInterceptTouchEvent,因此在viewGroup的子view中不会再接收到后续的move和up事件。

  3. onInterceptTouchEvent,返回true拦截事件交给自身的onTouchEvent方法处理这个表述是不完整的。我们知道如果onInterceptTouchEvent返回false,那么本次action将发送给更深层的View,
    并且之后的每一次action都会询问父层的onInterceptTouchEvent需不需要截获本次touch事件。如果第一次touch产生的down事件由子view进行处理了,那么后续产生的事件(move\up)在onInterceptTouchEvent()进行了return true的拦截,此时系统认为该viewgroup对此事件不进行处理,将调用父view的onTouchEvent()方法进行处理,并不会交给自身的onTouchEvent()来处理。我们说onInterceptTouchEvent,返回true拦截事件交给自身的onTouchEvent方法处理这个表述的满足情况是,actionDown事件在onInterceptTouchEvent 进行了拦截,会交给自身的onTouch来处理。

有兴趣可以关注一下个人的公众号,一起来交流学习;
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值