Android事件分发机制

参考blog

http://blog.csdn.net/z157794218/article/details/45690283

 

http://blog.csdn.net/To_be_Designer/article/details/48718667

 

http://blog.csdn.net/h9911/article/details/47405103

 

http://blog.csdn.net/pi9nc/article/details/9281829


整理:


事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

    当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。无论是Activity还是View,如前文所说,事件分发自身也具有消费能力,

如果事件分发返回true,表示事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。如果你不想Activity中的任何控件具有任何的事件消费能力,最简答的方法可以重写此ActivitydispatchTouchEvent方法,直接返回trueok

    如果事件分发返回 false,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。当然了,如果本层控件已经是Activity,那么事件将被系统消费或处理。

    如果事件分发返回系统默认的 super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理(如果本层控件是Activity,由于其没有事件拦截,因此将直接将事件传递到子View,并交给子View的事件分发进行处理)。

 

事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev) 

     如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理;

     如果返回结果是false;则表示不对事件进行拦截,事件得以成功分发到子View。并由子ViewdispatchTouchEvent进行处理。

     如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子ViewdispatchTouchEvent进行处理。

 

 事件响应:public boolean onTouchEvent(MotionEvent ev)

     如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。

     如果onTouchEvent返回false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层ViewonTouchEvent进行处理。

     如果返回super.onTouchEvent(ev),则默认处理的逻辑和返回false时相同。

 

总结:

1从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,

2但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。事件是否具有冒泡特是由onTouchEvent的返回值决定的。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值