一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤

本文详细探讨了Android中ViewGroup到View的事件分发流程,包括在不同ACTION下的处理,以及onTouch和onTouchEvent的区别。在面试场景中,作者通过分析代码和逻辑解释了如何理解事件拦截和消费,特别讨论了在ViewGroup内部如何处理ACTION_DOWN、ACTION_MOVE、ACTION_UP等事件,并解答了面试官关于事件处理和消费的问题。
摘要由CSDN通过智能技术生成

关于拦截无非就是拦截或不拦截,而拦截的条件是返回true,不拦截是返回false或返回super.onInterceptTouchEvent,默认的super是返回false的,因此可以用super表示不拦截

viewgroup拦截实际是通过在dispatchTouchEvent方法中,设置intercepted变量,如果在拦截方法里面返回true,那么intercepted为true,如果为true则在action_down的时候mFirstTouchTarget=null,那么此时是直接调用dispatchTransformedTouchEvent传入的child=null,因此将事件交给了super.dispatchTouchEvent,此时把它当成一个view来处理了。

面试官:有个viewgroup,里面有个view,如果view在dispatchTouchView中不分发事件,并且只在action_move中拦截touch事件向下分发,说说viewgroup到view的各个action是如何分发的?

分析

先贴出事例代码:

testView在testViewgroup里面,testViewgroup在action_move的时候拦截(onInterceptTouchEvent在move返回true),testView不进行分发(dispatchTouchEvent返回true) 咋们通过log来看结果:

这里执行到TestViewgroup#dispatchTouchEvent的action_move之后就执行了TestView#dispatchTouchEvent的action_cancel,然后后面执行TestViewgroup#dispatchTouchEvent和TestViewgroup#onTouchEvent的action_move和action_up。 从前面viewgroup的dispatchTouchEvent分析知道,如果viewgroup在action_down中发现有子view的dispatchTouchEvent返回true,则mFirstTouchTarget不为空,紧接着在action_move的时候进行了拦截&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值