为了账号安全,请及时绑定邮箱和手机立即绑定

小淇哥初学者基础教学之第一期——事件分发机制

标签:
Android

安卓开发当中,总有一些这种情况,为什么listview拖动没有效果,为什么按钮或者控件点击没有效果。为什么图片不能拉动等,这都是事件分发机制的问题;所以,事件分发机制的目的,就是为了处理各种事件,或者动作而产生的。


接下来,我将带大家一步一步解析这个流程:


在解析流程之前,先带大家,了解一下一些基本的动作:


我们平时操作手机,一般是由三个动作组成过程,按下,移动,抬起,在安卓中,这些动作,都是封装在类MotionEvent 中,可以获取到相应的动作操作;

在我们接下来要讲的各种方法中调用; 事件的分发处理,是分DOWN,MOVE,UP,三个过程分别去处理;举个例子:比如在一个ViewGroup中,就是DOWN的时候处理玩某个viewGroup的dispatchTouchEvent--onInterceptTouchEvent--onTouchEvent这整个流程,才会轮到MOVE动作。来重新处理整个流程,最后UP来处理整个流程;

事件分发事件的处理比较复杂,如果你能慢慢看文字或者找资料。也许也能看的懂,但是过段事件就可能又忘记了。所以,小淇哥我弄了一个图来给整个事件机制一个概述,让大家有一个大概的了解,然后再一步一步讲解:

5b9a104a000152c903790503.jpg

我们可以看到整个流程图。涉及到三个层,由上至下:activity---viewGroup---view层,这里的viewGroup可以是由多个的;

整个流程就是一个U型图,事件处理,先由左边的从上至下,再由右边的从下至上的处理过程:

另外:事件处理机制主要由dispatchTouchEvent--onTouchEvent两个过程,这个是基本过程。其中,在viewGroup中,还有一个事件拦截过程

onInterceptTouchEvent

重点详细解析:

1在activity层:这个层只有dispatchTouchEvent方法和onTouchEvent,若dispatchTouchEvent不进行事件分发了,就不会执行下面的onTouchEvent操作,而且,别的层也一样道理;


若你的点击没有碰到任何ViewGroup和View才会执行onTouch方法(当然,后面讲到下面的viewGroup和View返回为false,也会执行这个方法,这里可以先不管)


2若你的点击事件有三层的话,activity的dispatchTouchEvent返回True的时候,事件进行分发;

走到了viewGroup的流程,在viewGroup若进行onInterceptTouchEvent的返回为true的时候,就可以拦截到点击事件了。并且在viewGroup的onTouchEvent处理,后面View的就接收不到该事件了。


同理:只要是Down的拦截返回为true,后面的Move,和Up事件也不会经过onInterceptTouchEvent,拦截了一次。就不用拦截了。也就是不用经过该方法了;若ViewGroup没有进行拦截,就会返回到View的事件分发方法dispatchTouchEvent,和onTouchEvent方法;而这里要重点介绍的是一个U型过程的重下至上的,就是如果View的onTouchEvent没有被消费,就会返回false,就会轮到上一层的ViewGroup判断,是否需要消费;如果返回true,就会在该层进行消费掉,不进行上传。就是这个意思;5b9a104a00017fca06260307.jpg

这里是截图。你们可以拿我的demo去一个一个试试!




原文链接:http://www.apkbus.com/blog-880881-68322.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消