Android的事件分发机制(一)

activity的layout中嵌入MyLayout,并在其中加入自定义MyView,在三个嵌套的视图中,
,
当点击这个myview时,事件的传递首先从Activity的dispatchTouchEvent(MotionEvent e)方法开始调用用switch判断每种MotionEvent输出Log,发现会响应ActionDown
这里写图片描述这里写图片描述
也用switch判断事件并且输出Log响应ActionDown,
之后在执行boolean b =super.dispatchTouchEvent(e)这句时就会跳到MyLayout的dispatchTouchEvent(MotionEvent e)方法,同样用switch判断事件并且输出Log响应ActionDown
这里写图片描述
同样在diapatchTouchEvent的最后boolean b=super.dispatchTouchEvent(e)
这句执行将会跳到MyLayout的这个方法
这里写图片描述这里写图片描述
执行(容器型的ViewGroup才有这个方法)OnInterceptTouchevent方法的最后
boolean b=super.onInterceptTouchEvent() ;
Log输出 “Mylayout—-onInterceptTouchEvent的super.dispatchTouchEvent(event)–>false”直接返回false–>就是不干扰,让事件继续向其子控件传递
这里写图片描述(点击super.dispatchTouchEvent(event)默认为false)
再跳到MyLayout重写的OnTouchEvent方法中
这里写图片描述
在OnTouchEvent这个方法中执行这句
boolean b=super.onTouchEvent(e) (MyView继承View,enableclick=false,这就是默认值为false;如果MyView继承Button,enableclickfalse,这就是默认值为true),但是在这里最后故意让它返回true
这里写图片描述,
这就表示MyView对这个事件感兴趣,消费了它,事件在这里分发终止,所有super.dispatchTouchEvent(e)开始有返回值了,就是OnTouchEvent返回的true,
所以MyView的dispatchTouchEvent(MotionEvent e)方法中这句boolean b = super.dispatchTouchEvent(b =true),
所以MyLayout的dispatchTouchEvent(MotionEvent e)方法中这句boolean b = super.dispatchTouchEvent(b =true),
所以MyActivity的dispatchTouchEvent(MotionEvent e)方法中这句boolean b = super.dispatchTouchEvent(b =true),
并且注意了,MyLayout的onTouchEvent(e)和Activity的onTouchEvent(e)就不会再执行了,因为在之前就已经被MyView消费掉了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值