ANDROID Event Handlers

1、ViewGroup1的 onInterceptTouchEvent如果在ACTION_DOWN就返回true,  

那么ViewGroup1的onInterceptTouchEvent的ACTION_MOVE、ACTION_UP, 都不会执行;

而是ViewGroup1的onTouchEvent的ACTION_DOWN将会响应;

如果ViewGroup1的onTouchEvent的ACTION_DOWN返回true,

那么ViewGroup1的onTouchEvent的ACTION_MOVE/ACTION_UP将会响应;


2、ViewGroup1的 onInterceptTouchEvent如果在ACTION_DOWN就返回false,  

那么ViewGroup1的onInterceptTouchEvent的ACTION_MOVE/ACTION_UP, 就会被执行;

如果ViewGroup1的onInterceptTouchEvent的ACTION_MOVE/ACTION_UP返回true,

那么ViewGroup1的onTouchEvent的相对应的ACTION_MOVE/ACTION_UP将会响应;

如果ViewGroup1的onTouchEvent的ACTION_MOVE返回true,

那么ViewGroup1的onTouchEvent的ACTION_UP将会响应;


Example:activity里有一个LAYOUT,在布局里有个按钮。

如果在按钮上触发一个CLICK事件

首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch(这是一个ACTION_DOWN事件)

紧跟着是一个ACTION_UP事件

触发ACTIVITY的dispatchTouchEvent

注意不再触发ACTIVITY的onUserInteraction,因为他对ACTION_UP不起作用。

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch

最后触发BUTTON的onClick.

如果你在ONTOUCH事件里返回true,消费了此事件,那么ONCLICK将不会被响应

下面贴出 ViewGroup 的 onInterceptTouchEvent和onTouchEvent方法调用顺序。

另外 ,view是没有onInterceptTouchEvent方法的。

用一句话概括:自顶向下的事件分发与自底向上的事件响应机制。

下面介绍一下三个方法的区别:

1、dispatchTouchEvent作用:决定事件是否由onInterceptTouchEvent来拦截处理。

  • 返回super.dispatchTouchEvent时,由onInterceptTouchEvent来决定事件的流向
  • 返回false时,不会继续分发事件,自己内部只处理了ACTION_DOWN
  • 返回true时,不会继续分发事件,自己内部处理了所有事件(ACTION_DOWN,ACTION_MOVE,ACTION_UP)

2、onInterceptTouchEvent作用:拦截事件,用来决定事件是否传向子View

  • 返回true时,拦截后交给自己的onTouchEvent处理
  • 返回false时,不拦截,交给子View来处理

3、onTouchEvent作用:事件最终到达这个方法

  • 返回true时,内部处理所有的事件
  • 返回false时,事件会向上传递,由onToucEvent来接受,如果最上面View中的onTouchEvent也返回false的话,那么事件就会消失。

测试案例:

ViewGroup里有一个View。


全部默认:

03-25 16:35:20.695: I/Snake(31357): ViewGroup--onInterceptTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onInterceptTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--dispatchTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): View--onTouchEvent:false
03-25 16:35:20.695: I/Snake(31357): ViewGroup--onTouchEvent:false


ViewGroup--onInterceptTouchEvent : true

03-25 16:58:35.205: I/Snake(15365): ViewGroup--onInterceptTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--dispatchTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onInterceptTouchEvent:false
03-25 16:58:35.205: I/Snake(15365): ViewGroup--onTouchEvent:false

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值