view事件分发机制

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值