view传递事件的处理机制(自定义了viewGroup和LinearLayout做实验)

本文通过自定义ViewGroup和LinearLayout的实验,深入探讨了Android中View的时间处理传递机制,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent三个关键方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近为了明白view时间处理传递机制,特此了做了实验,自定义了viewGroup和LinearLayout做实验,重写了dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,总结了四种情况。

事先在脑袋里有这么一些概念:

ACTION_DOWN //表示按下了屏幕
 ACTION_MOVE //表示为移动手势
 ACTION_UP //表示为离开屏幕
 ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序产生的
 一个Action_DOWN, n个ACTION_MOVE, 一个ACTION_UP,就构成了Android中众多的事件
 ViewGroup类的控件嵌套时事件触发情况、
 0. dispatchTouchEvent()//事件的分发,方法是从父View向子View传递
 1. onInterceptTouchEvent() //是否中断事件的传递,如果返回true,则把事件给当前view的onTouchEvent()方法,方法是从父View向子View传递
 2. onTouchEvent() //接收事件并处理,从子View向父View传递
 //返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去。

屏幕view布局:

接着分析四种情况:

情况一:当所有的都不进行处理的时候即返回false  ,每个方法里面的   log打印,作为对比参照物。
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.onInterceptTouchEvent
 CustomerLinearLayout.dispatchTouchEvent
 CustomerLinearLayout.onInterceptTouchEvent
 CustomerLinearLayout.onTouchEvent
 CustomerViewGroup.onTouchEvent

情况二:当CustomerViewGroup.onInterceptTouchEvent()放回true 的时候,对比情况一,那就说明CustomerViewGroup中断了
事件的传递,他当前的响应交由onTouchEvent()处理,而不往下传递给CustomerLinearLayout,
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.onInterceptTouchEvent
 CustomerViewGroup.onTouchEvent

情况三:CustomerViewGroup.dispatchTouchEvent()返回true的时候说明事件不分发,自己方法处理了,对比情况一,就知道CustomerViewGroup.onInterceptTouchEvent
都没有响应了。
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.dispatchTouchEvent

情况四:onTouchEvent(),这个方法比较特殊,和dispatchTouchEvent(),onInterceptTouchEvent()方法不同的是他是
子view往上传递的,意思就说,所有的view一级一级的dispatchTouchEvent(),onInterceptTouchEvent()都是返回false
那么也就是把事件传递到最底层的view,最底层的view中的onTouchEvent()如果返回true,那么就是代表响应,事件就会
这个方法消耗,如果返回false,那么久代表事件没有被处理,那么又会返回到上层父view,直到被处理了。
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.onInterceptTouchEvent
 CustomerLinearLayout.dispatchTouchEvent
 CustomerLinearLayout.onInterceptTouchEvent
 CustomerLinearLayout.onTouchEvent
 CustomerViewGroup.dispatchTouchEvent
 CustomerViewGroup.onInterceptTouchEvent
 CustomerLinearLayout.dispatchTouchEvent
 CustomerLinearLayout.onTouchEvent//上面可以看到CustomerViewGroup.onTouchEvent都不打印了也就是说消耗了事件

对比上述的实验,也就能明白了,view事件的传递机制了,对于自定义view有很大帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值