OnTouch、OnTouchEvent返回true或返回false,究竟意味着什么?
不管你在MainActivity类中所使用的xml布局文件中注册了多少个View ,也不管View是否都设置了获取焦点,只要你在 MainActivity 中重写onKeyDown()函数,Android 就会调用此函数。但是如果该类拥有一个自定义的View,那在该自定义View的构造函数中必须调用setFocusable(true), 该自定义view中的onKeyDown()函数才会执行,否则不会执行.
// true: 1.告诉Android,MotionEvent对象已被使用,不能再提供给其他方法。
// 2.还告诉Android,继续将此触摸序列的触摸事件(move,up)发送到此方法。
// false:1.告诉Android,onTouch()方法未使用该事件,所以Android寻找要调用的下一个方法。
// 2.告诉Android。不再将此触摸序列的触摸事件(move,up)发送到此方法。
onTouchEvent 、onInterceptTouchEvent的顺序~
本文的目的在于测试android viewgroup中 touchevent的传递方向。
ViewGroup 中onInterceptTouchEvent()
View 结构:
FirstGroup
SecondGroup
Child
1、默认情况下:
super.onInterceptTouchEvent()
super.onTouchEvent()
都是返回false.
这个时候的传递方向(注意,这个时候并没有触发Move事件!):
First Group onIntercept Down
Second Group onIntercept Down
Child onTouch Down
Second Group onTouch Down
First Group onTouch Down
2、假如FirstGroup的onInterceptTouchEvent() 返回 true
那么从属于FirstGroup的所有child view的touch事件都被FirstGroup给截取了:
First Group onIntercept Down
First Group onTouch Down
3、FirstGroup的onInterceptTouchEvent() 返回 true
并且 FirstGroup的onTouchEvent()返回true
那么
First Group onIntercept Down
First Group onTouch Down
First Group onTouch Move
First Group onTouch Move
First Group onTouch Move
First Group onTouch Up
4、FirstGroup的onInterceptTouchEvent() 返回 false
并且FirstGroup的onTouchEvent()返回true
那么
First Group onIntercept Down
Second Group onIntercept Down
First Group onTouchDown
Second Group onTouch Down
First Group onTouchMove
First Group onTouchMove
First Group onTouchMove
First Group onTouchUp
5、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回false
那么从属于SecondGroup的所有child view的touch事件都被SecondGroup给截取了:
First Group onIntercept Down
Second Group onIntercept Down
Second Group onTouch Down
First Group onTouchDown
6、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回true
First Group onIntercept Down
Second Group onIntercept Down
Second Group onTouch Down
First Group onIntercept Down
........
7、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回true
8、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回false
Child的onTouchEvent()返回true
总结 根ViewGroup的onInterceptTouchEvent() 是否要拦截(注意,拦截必须在第一次action down的时候!)touch event如果true,就是拦截所有的touch事件,并交给当前的viewgroup去处理!不拦截的话,就交给儿子ViewGroup处理touch event,同样的,要是它不拦截,就可以继续传递下去给儿子(也就是根ViewGroup的孙子)
如果目标view的 touch event返回false,那么,所有都不会产生action move动作;如果返回true,那么,目标view会产生touch event,而且会触发它的父view们onInterceptEvent 的 action move,注意并不会触发他们的touch event~
一般情况下:
onInterceptTouchEvent()是自Root 到 Child(要记得在Action Down中处理)
onTouchEvent()是自Child 到 Root.