yxwww 发表于 2013-1-14 18:03:02

onTouchEvent 、onInterceptTouchEvent的顺序~

 
本文的目的在于测试androidviewgroup中 touchevent的传递方向。
 
ViewGroup 中onInterceptTouchEvent()
 
 
View 结构:
 
FirstGroup
       SecondGroup
              Child
 
1、默认情况下:
super.onInterceptTouchEvent()
super.onTouchEvent()
都是返回false.
这个时候的传递方向(注意,这个时候并没有触发Move事件!):

http://dl.iteye.com/upload/attachment/0063/3611/3d4b3637-39dd-3422-8c75-c358fb3cfc2a.png
 
2、假如FirstGroup的onInterceptTouchEvent() 返回 true
那么从属于FirstGroup的所有child view的touch事件都被FirstGroup给截取了:

http://dl.iteye.com/upload/attachment/0063/3613/808fb2f7-2435-3a86-9a20-2bf71ac48ded.jpg
3、FirstGroup的onInterceptTouchEvent() 返回 true
并且 FirstGroup的onTouchEvent()返回true
那么

http://dl.iteye.com/upload/attachment/0063/3615/6dcefacd-3819-3962-a2cb-8733911dc3ca.jpg
 <!---->
 
4、FirstGroup的onInterceptTouchEvent() 返回 false
并且FirstGroup的onTouchEvent()返回true
那么

http://dl.iteye.com/upload/attachment/0063/3617/95297298-e73f-3506-a4f5-47103b344190.jpg
 <!---->
 
5、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回false
那么从属于SecondGroup的所有child view的touch事件都被SecondGroup给截取了:

http://dl.iteye.com/upload/attachment/0063/3619/3f74635f-8444-30ac-b6a7-29d6528967ba.jpg
 <!---->
 
6、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回true
 

http://dl.iteye.com/upload/attachment/0063/3621/b09d9e32-8e89-3355-b668-6daa3a1b7b61.jpg
 
<!---->
7、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回true

http://dl.iteye.com/upload/attachment/0063/3623/1cc00587-bfe2-3c3d-ae64-18d589bddebd.jpg
 <!---->
8、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回false
Child的onTouchEvent()返回true
 

http://dl.iteye.com/upload/attachment/0063/3625/988f42e9-b45a-3c64-8cf0-48b5b24ce026.jpg
  
总结 根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.
 
页: [1]
查看完整版本: onTouchEvent 、onInterceptTouchEvent的顺序~