自定义组件_事件处理机制

1、Android的事件触发和响应过程
这里写图片描述
A、事件完整的响应过程:
先传递事件:Activity -> ViewGroup -> View
再处理事件:View -> ViewGroup -> Activity

事件传递和处理过程中涉及的几个方法:
1)分发事件
public boolean dispatchTouchEvent(MotionEvent ev)
向子组件传递事件的动力源
Activity、ViewGroup、View都有该方法,该方法不管返回true还是false都会阻止事件的继续传递。所以,dispatchTouchEvent方法的返回值一般都要设置为return super.dispatchTouchEvent(ev)。

2)拦截事件
public boolean onInterceptTouchEvent(MotionEvent ev)
用于拦截事件的传递,可以用于防止事件继续传递
只有ViewGroup才有该方法。

3)响应处理事件
public boolean onTouchEvent(MotionEvent event)
该方法默认返回true。
返回值为true表示事件已被组件处理完毕,组件的上一级不会继续处理该事件。
返回值为false表示事件还可以让上一级组件继续处理。

2、事件场景理解
这里写图片描述
场景1:不拦截事件,也不处理事件
这里写图片描述
在一个事件周期中,事件有“记忆”的功能,如果事件没有任何组件来处理,则ACTION_MOVE的动作直接交给最外层处理。

场景2:把TextView的clickable属性手动改成true,或者直接重写onTouchEvent()方法,使其返回true。
这里写图片描述
场景3:手动重写LinearLayout的onInterceptTouchEvent()方法,使其返回true,拦截事件,再重写onTouchEvent()方法,返回true
这里写图片描述
注意:
(1)这一系列的传递流程都是dispatchTouchEvent()方法来控制的,如果不人为地干预,事件将由上自下依次传递(因为默认是返回false不会拦截的),传递到最底层的View,就由它的onTouchEvent()方法来处理事件,若处理成功返回true,若处理失败返回false,事件依次向上传递,每个View都调用自己的onTouchEvent()方法来处理事件,若处理成功就终止传递,若处理失败就继续向上传递。

(2)经过人为的干预,若在向下传递的过程中被拦截了,即onInterceptTouchEvent()方法返回true,则事件将停止向下传递,直接由当前的onTouchEvent()方法来处理,若处理成功则OK,若处理不成功,则事件会向上传递。

(3)另外,dispatchTouchEvent()方法中还有“记忆”的功能,如果第一次事件向下传递到某View,它把事件继续传递交给它的子View,它会记录该事件是否被它下面的View给处理成功了,(怎么能知道呢?如果该事件会再次被向上传递到我这里来由我的onTouchEvent()来处理,那就说明下面的View都没能成功处理该事件);当第二次事件向下传递到该View,该View的dispatchTouchEvent()方法机会判断,若上次的事件由下面的view成功处理了,那么这次的事件就继续交给下面的来处理,若上次的事件没有被下面的处理成功,那么这次的事件就不会向下传递了,该View直接调用自己的onTouchEvent()方法来处理该事件。

(4)“记忆”功能的信息只在一系列事件完成之前有效,如从ACTION_DOWN事件开始,直到后续事件ACTION_MOVE,ACTION_UP结束后,“记忆”的信息就会清除。也就是说如果某View处理ACTION_DOWN事件失败了(onTouchEvent()返回false),那么后续的ACTION_MOVE,ACTION_UP等事件就不会再传递到该View了,由其父View自己来处理。在下一次发生ACTION_DOWN事件的时候,还是会传递到该View的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值