安卓里面的事件分发初体验

来源:互联网 发布:node in action中文版 编辑:程序博客网 时间:2024/06/06 03:29

在安卓里面经常能看到有些事件或方法的返回类型是boolean类型,刚开始还会想难道是判断这个方法执行了没。直到学到了事件分发这里才算有了初步理解,什么叫事件分发?事件分发就是专门为了处理事件之间的冲突或者是控件处理事件的行使权的一种机制,举个例子,下面先上一张图片,

这是一个线性布局LinearLayout是绿色的部分,里面只有一个TextView是红色的部分,当我们单击TextView时候,请问下是谁先捕捉到单击事件的呢?首先是Activity,再是线性布局,再是TextView,这就像是一个公司需要处理公关事件,首先是公司高层得到处理事件的消息,他就把事情分发下去,让部门经理去处理,部门经理有可能自己处理,也有可能将事件继续委派给员工处理。接下来,介绍关于事件分发的三个方法,onIntercepteTouchEvent()方法是表示拦截事件的方法,dispatchTouchEvent()是表示分发事件的方法,onTouchEvent()是表示处理点击事件的方法。接下来,为了体现他们的作用,我们用log.i()分别将它们的调用顺序输出,由于系统的LinearLayout里面不能在里面写方法,因此我们自定义一个MyLinearLayout让它继承LinearLayout,在这个类里面实现这三个方法,其它的不做改变,将它加到布局中。同时在Activity和TextView里面实现这些方法,Activity最先捕获方法,因此它不具有拦截的onInterceptTouchEvent()方法,TextView是最底层,因此也没有onInterceptTouchEvent()方法。接下来当我们按下红色部分的TextView时,打印日志的截图如下:后面的两条是点击事件松开时执行的,前面的几条可以看出我们按下事件发生时,事件分发的处理顺序和方向,这个输出结果是正常的执行顺序,也就是系统默认的顺序,首先是向下分发,然后是有子控件的容器有截断的权利,这里系统默认是不截断的,当事件传到TextView时,系统默认OnTouch()方法也是未处理的,所以接着向上扩散,直到有容器处理事件,如果没有处理,最后让Activity来处理。接着,我们打印出系统这些方法的默认返回值,这里只打印出LinearLayout两个方法的默认值,其它控件方法返回的默认值是一样的,截图如下:这两个方法的默认值是false,也就是说默认是不截断和未处理的。对于dispatchTouchEvent()分发事件的处理我们就让它返回系统的默认值就好了,因为我们关键是需要对以上两个方法进行处理。然后我们修改它们两个的返回值,截图如下:将MyLinearLayout里面的onInterceptTouchEvent()方法返回true之后,TextView下面不进行分发。但是事件仍然会向上扩散。当我们将MyLinearLayout里面的onTouchEvent()方法返回值也改成true的时候,打印输出的结果如下,这时发现事件不再向上扩散,后两个打印结果为松开时触发的,是另一个事件,同时我们也可以得出一个结论,按下的事件是谁处理的,松开事件就是谁处理的。

       接下来,基本上可以做个总结,分发事件这种机制处理事件时的先后顺序是先向下分发dispatch()再向上扩散处理onTouchEvent(),在中间可以包含子控件的容器具有onIntercepteTouchEvent方法,截断之后就自己可以处理,如果没有处理,事件继续向上扩散。还有,按下事件是谁处理的,松开事件就是谁处理的,这个很好理解,你在同一个地方按下肯定是在同一个地方松开的。另外,在处理多个事件冲突的时候,可以通过返回true表示这个事件已经处理不再向外扩散,就可达到想要的效果。

  

0 0
原创粉丝点击