Android事件分发与传递

Android事件分发:由下往上(由根视图依次分发到最上层视图).
一般说到事件分发和响应都会不自觉的联系到ViewGroup/View的相关函数:
ViewGroup 相关函数中涉及的有dispatchToucheEvent(Event ev),onInterceptTouchEvent(Event ev),onTouch(Event ev) 
View 相关函数涉及的有:dispatchToucheEvent(Event ev),onTouch(Event ev) 
一次默认的事件传递情景应该是这样的:父容器dispatchToucheEvent-父容器onInterceptTouchEvent-子视图dispatchToucheEvent-子视图onTouch-父容器onTouch
下面来具体解释下这几个函数:
①dispatchToucheEvent(Event ev)
含义:这个函数主要用于事件的分发,只要有一次Touch事件,那么如果它的父容器没有任何阻截(父容器不分发或者拦截或onTouch消费了事件)的情况下,
     它默认都是会执行分发,这就是一次事件分发。对于父容器来说,dispatchToucheEvent返回true,决定是否是父视图消费该事件的,除了onInterceptTouchEvent还可能有        onTouch返回值。        
默认值:默认返回ture(表示要分发当前事件),反之。
②onInterceptTouchEvent(Event ev)
含义:这个函数主要用于拦截事件,发生在dispatchToucheEvent分发之后。如果onInterceptTouchEvent返回true:表示拦截当前分发出来的事件,不会分发到子视图,并让自己的onTouch执行。反之,继续向下分发到子视图。
默认值:默认返回false(表示不拦截当前事件),反之。
③onTouch(Event ev) 
含义:这个是主要处理事件消费的函数,Event中包括:action_down,action_move,action_up三个动作。
默认值:默认返回false(表示不消费当前事件),这里我必须下解析"消费"的概念,打个比方:同一个水管上有A,B两个水龙头(一次只能出水一个),A居上,B居下。他们要将各自的水池填满水。
水流就是一次事件传递(分发),龙头开关就是一次事件(拦截).水流进入水池就是一次事件(消费).如果A打开,那么水流入A水池,事件(水流开始,水流暂停,水流停止)就被消费了,B没有收到任何消息。
如果B打开,那么事件就被B消费了,如果A,B都没打开,那么B的事件返回false过后,B不处理还会交给A来处理。总之它们就是一次"让与不让处理的过程"。
下面我写个测试工程(一个父容器中包含一个子视图)用于验证上面的结论:

解析:①正常情况(默认情况):

当我们点击父容器Log日志如下:


当我们点击childViewLog日志如下:

现在我们将parentView的onTouch返回true的时候:

那么一旦执行到父容器的onTouch事件后,后续的事件都会被消费,childView除了action_down事件能分发出来之外,其他事件都不会分发过来,因为parent的onInterceptTouchEvent会判断onTouch,如果监测到onTouch返回true,那么后续的action_move,action_up都不会再次进行拦截。


当childView的onTouch返回true:

当parentView的dispatchTouchEvetn返回false:表示不分发事件,那么不管是它的后续函数(包括onInterceptTouchEvent,onTouch)还是childView的分发,拦截,touch事件都不会执行。

当parentView的onInterceptTouchEvent返回true时:事件只会传递给它的onTouch,childView没有任何事件。

最后附上简单的Demo一个。

关于实际项目中涉及的相关控件,我会在后续博客中附上源码。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值