个人学习总结:
首先,先介绍一下onInterceptTouchEvent与onTouchEvent,onInterceptTouchEvent是ViewGroup中的方法,该方法有两个作用:1.执行用户按键操作,可将相应按键时间写入其中。2.通过返回值指定过滤方向(是否过滤到子控件还是当前layout层)。onTouchEvent是View中的方法,也有两个作用:1..执行用户按键操作,可将相应按键时间写入其中。2.通过返回值确定传过来的按键事件是否被消费(consume)。
由于ViewGroup继承自View,所以ViewGroup除了onInterceptTouchEvent,还有onTouchEvent,而View只有onTouchEvent方法。在一般开发中,都是ViewGroup中布局若干个View,例如:一个FrameLayout中有一个Button,接下来的例子可以参考:http://blog.csdn.net/android_tutor/article/details/7193090和http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html。
前面这两个链接希望各位自己动手去试试,因为其中有些本人不敢苟同,觉得有些描述含糊不清,容易让人产生误解。最主要还是自己动手去发现,但是第一个链接中的例子还是不错的。
总结:1.以上标红处。
2.如果当前层的onTouchEvent消费了按键事件(return true),那么后续的操作将在该层的onTouchEvent中继续执行(如action _up,action_move),如果是子控件的onTouchEvent消费了按键事件,那么后续的操作将回到父控件的onInterceptTouchEvent执行(onInterceptTouchEvent的action _up,action_move);
以下是个人小发现,如果以上能帮助到各位,下面就不用看了。
备注:在试验过程中发现一个“探路”的现象。前提layout<layout1<view,<为包含关系,如果将layout1的onInterceptTouchEvent与onTouchEvent返回值都设置为true,那么点击之后的log是layout.onInterceptTouchEvent.down
layout1.onInterceptTouchEvent.down
layout1.onTouchEvent.down
layout.onInterceptTouchEvent.up
layout1.onTouchEvent.up
下面来分析一下这个log:首先点击以后从layout1.onInterceptTouchEvent.down开始返回false过滤到layout1.onInterceptTouchEvent.down,而layout1.onInterceptTouchEvent.down返回true,拦截在当前层,到
layout1.onTouchEvent.down,(至此,发现layout1就是最后一层,因为layout1.onInterceptTouchEvent.down返回true,所以layout1是叶节点层,down按键事件就是探路的那个探子,因为它发现了layout1是最后一层),而layout1.onTouchEvent.down又返回true,消费了down事件,然后根据总结处的第二条,子控件的onTouchEvent消费了按键事件,那么后续的操作将回到父控件的onInterceptTouchEvent执行,就有了layout.onInterceptTouchEvent.up,而layout.onInterceptTouchEvent.up返回false,理应过滤到layout1.onInterceptTouchEvent.up,但是探子发现layout1就是最后一层,那么就无需走layout1.onInterceptTouchEvent.up,而是直接走的layout1.onTouchEvent.up。