View与ViewGroup的分发处理逻辑

  • 默认情况,一个消息最后只需要一个人处理,其它消息途径者都只是干了中转的效果。
  • 消息传递途径三级处理机制:
    • 接受上级消息(dispatchTouchEvent),
    • 决策向下级分发还是自身处理(onInterceptTouchEvent),
    • 自身处理逻辑(onTouchEvent、onTouch 、onClick 、onLongClick 等)
  • View内部自身处理逻辑先后顺序,依次是:(注:在return不为true的情况下)
    • onTouchEvent
    • onClick
    • onLongClick
  • OnTouchListener onTouch onTouchEvent 的区别
    • 首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
    • onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.
    • 更详细的可以看  http://blog.csdn.net/ddna/article/details/5451722
  • 消息处理中, return true 表示消息被完整地处理完成了,后面不用再用其他事件处理了。

 

  • dispatchTouchEvent

 

接受上级传递过来的消息
抽象对象的对外调用接口。
对外部来说,只知道这个接口,不知道其他。相当于企业门卫,邮递员是把信给门卫的。
1、返回值:false 

不接受动作序列中的后续事件
我们一般遇到事件有3种,分别是:Down、move、up False表示不接受动作序列中的后续事件,因此本次后续操作不起作用, 如:down后返回false,则move和up都不会被接受,只能接受下个动作。

2、返回值:true  
继续接受动作序列中的后续事件,如move、up

其中如果调用了Super.dispatchTouchEvent。 这样就会继续调用onInterceptTouchEvent事件。

如果返回值是 Super.dispatchTouchEvent ,意味着由onInterceptTouchEvent决定事件流向,

Super.dispatchTouchEvent 的返回值就是系统默认的,系统默认最终只有一个控件处理这个消息。
如果需要多个控件同时处理,则一定需要返回true,并调用Super.dispatchTouchEvent

 

  • onInterceptTouchEvent
抽象对象对内的接口。
相当其企业的内勤,负责分发信件。
不过要注意的是,一旦动作序列的down事件知道了该如何分发,下次就会绕过它
返回值:true

自己处理,不需要继续下传
事件会传递到自己的onTouchEvent()

Down事件在onInterceptTouchEvent()后返回true,则传递到onTouchEvent,

当其返回true时,动作序列的后续事件不会再通过onInterceptTouchEvent了,而是在dispatchTouchEvent中直接传递于onTouchEvent。
返回值:false
自己无法完全处理,或者不能处理,继续下传

传递到下一个view的dispatchTouchEvent()

onInterceptTouchEvent返回false应该传给下个子view的dispatchTouchEvent,但是,点击的叶子节点view,因此不存在子view而直接传给自己的onTouchEvent

onInterceptTouchEvent要做的就是确定事件传递到哪个子view,如果返回false,又没有子view处理(因为根本就没有点击到子view),就自己处理了,而自己在onTouchEvent处理的后续事件就不必经过onInterceptTouchEvent了,它是判断传递给子view的,都不是子view处理,就不用经过了。

 

  • onTouchEvent
  • 实现View.OnClickListener 的onClick
  • 实现View.OnLongClickListener 的 onLongClick
  • 实现View.OnTouchClickListener 的 onTouch
具体干事的
这里有个先后顺序。
如果先工作的把这件事情结束了,就不会继续传递下去了。
如果我们在一个View中同时覆写了onClick、onLongClick及onTouchEvent的话,onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。
返回值 true和false在其中起着标志事件是否被消耗,
如果消耗了就不再传递给其他控件了。
如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值