Android的ViewGroup中事件的传递机…

本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下。

根据字面意思的理解,dispatchTouchEvent分发触摸事件,onInterceptTouchEvent拦截触摸事件,onTouchEvent触摸事件。正如它们各自的字面意思,下面简单的列出各自的作用和用法。

以下面为例进行说明:
group1 = new Group1(this);
group2 = new Group2(this);
myTv = new MyTextView(this);
group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
setContentView(group1);

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

返回super.dispatchTouchEvent时,由onInterceptTouchEvent来决定事件的流向

02-21 11:48:54.797: D/logcat(3892): Group1 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.801: D/logcat(3892): Group1 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.833: D/logcat(3892): Group2 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.833: D/logcat(3892): Group2 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.834: D/logcat(3892): MyTextView onTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.834: D/logcat(3892): Group2 onTouchEvent触发事件:ACTION_DOWN
02-21 11:48:54.835: D/logcat(3892): Group1 onTouchEvent触发事件:ACTION_DOWN

返回false时,不会继续分发事件,自己内部只处理了ACTION_DOWN

02-21 11:49:41.115: D/logcat(4534): Group1 dispatchTouchEvent触发事件:ACTION_DOWN

返回true时,不会继续分发事件,自己内部处理了所有事件(ACTION_DOWN,ACTION_MOVE,ACTION_UP)

02-21 11:50:38.484: D/logcat(4627): Group1 dispatchTouchEvent触发事件:ACTION_DOWN 
02-21 11:50:38.520: D/logcat(4627): Group1 dispatchTouchEvent触发事件:ACTION_MOVE
02-21 11:50:38.536: D/logcat(4627): Group1 dispatchTouchEvent触发事件:ACTION_MOVE
02-21 11:50:38.539: D/logcat(4627): Group1 dispatchTouchEvent触发事件:ACTION_UP

 

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

返回true时,拦截后交给自己的onTouchEvent处理

02-21 12:07:49.553: D/logcat(4979): Group1 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 12:07:49.554: D/logcat(4979): Group1 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:07:49.554: D/logcat(4979): Group1 onTouchEvent触发事件:ACTION_DOWN

返回false时,拦截后交给子View来处理

02-21 12:08:38.661: D/logcat(5092): Group1 dispatchTouchEvent触发事件:ACTION_DOWN 
02-21 12:08:38.688: D/logcat(5092): Group1 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:08:38.689: D/logcat(5092): Group2 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 12:08:38.690: D/logcat(5092): Group2 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:08:38.690: D/logcat(5092): MyTextView onTouchEvent触发事件:ACTION_DOWN
02-21 12:08:38.691: D/logcat(5092): Group2 onTouchEvent触发事件:ACTION_DOWN
02-21 12:08:38.691: D/logcat(5092): Group1 onTouchEvent触发事件:ACTION_DOWN

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

返回true时,内部消费掉事件,后续事件可以继续分发过来

02-21 12:14:39.799: D/logcat(5204): Group1 dispatchTouchEvent触发事件:ACTION_DOWN 
02-21 12:14:39.821: D/logcat(5204): Group1 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.822: D/logcat(5204): Group2 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.822: D/logcat(5204): Group2 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.822: D/logcat(5204): MyTextView onTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.823: D/logcat(5204): Group2 onTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.823: D/logcat(5204): Group1 onTouchEvent触发事件:ACTION_DOWN
02-21 12:14:39.849: D/logcat(5204): Group1 dispatchTouchEvent触发事件:ACTION_MOVE
02-21 12:14:39.851: D/logcat(5204): Group1 onTouchEvent触发事件:ACTION_MOVE
02-21 12:14:39.864: D/logcat(5204): Group1 dispatchTouchEvent触发事件:ACTION_MOVE
02-21 12:14:39.868: D/logcat(5204): Group1 onTouchEvent触发事件:ACTION_MOVE
02-21 12:14:39.871: D/logcat(5204): Group1 dispatchTouchEvent触发事件:ACTION_UP
02-21 12:14:39.873: D/logcat(5204): Group1 onTouchEvent触发事件:ACTION_UP

返回false时,事件没有被消费掉,事件会向上传递,由onToucEvent来接受,如果最上面View中的onTouchEvent也返回false的话,那么事件就会消失。

这一次事件没有被消耗掉,则系统不会给你下一次事件,因为他会认为你这次的事件阻塞了,没必要给下一次。onTouchEvent如果不消耗的话,会从子view传递到父view。

02-21 12:16:47.366: D/logcat(5330): Group1 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.410: D/logcat(5330): Group1 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.412: D/logcat(5330): Group2 dispatchTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.413: D/logcat(5330): Group2 onInterceptTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.413: D/logcat(5330): MyTextView onTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.414: D/logcat(5330): Group2 onTouchEvent触发事件:ACTION_DOWN
02-21 12:16:47.414: D/logcat(5330): Group1 onTouchEvent触发事件:ACTION_DOWN

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值