Anroid Touch 事件传递机制

Android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:

1.public boolean dispatchTouchEvent(MotionEvent ev)   用来分发TouchEvent

2.public boolean onInterceptTouchEvent(MotionEvent ev)   用来拦截TouchEvent

3.public boolean onTouchEvent(MotionEvent ev)    用来处理TouchEvent

只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view,所以不用再向他的子视图分发,他也没有子视图,所以他是没有dispatch和intercept,只有touchEvent;

由中心区域处理touch事件:

首先触摸事件发生时(ACTION_DOWN),由系统调用Activity的dispatchTouchEvent方法,分发该事件,根据触摸事件的坐标,将此事件传递给out的dispatchTouchEvent处理,out则调用onInterceptTouchEvent判断事件是由自己处理,还是继续分发给子VIew。此处由于out不处理Touch事件,所以根据事件发生坐标,将事件传递给out的直接子View(即middle)。

middle及Center中事件处理过程同上,但是由于center组件是clickable表示其能处理touch事件,故Center中的onInterceptTouchEvent方法将事件传递给center自己的ontouchEvent方法处理,至此,此touch事件已被处理,不继续进行传递。



没有指定谁会处理touch事件:




事件处理流程大致相同,区别是所有组件都不会处理事件,事件并不会被center的

onTouchEvent方法“消费”,则事件会层层逆向传递回到Activity,若Activity也不对此事件进行处理,此事件相当于消失了(无效果)。

对于后续的move、up事件,由于第一个down事件已经确定由Activity处理事件,故up事有由Activity的dispatchTouchEvent直接分发给自己的onTouchEvent方法处理。



1) Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去,这个是最基本的。

2) 事件传递的两种方式: 
隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。 
冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。 android对Touch Event的分发逻辑是View从上层分发到下层(dispatchTouchEvent函数)类似于隧道方式,然后下层优先开始处理Event(先mOnTouchListener,再onTouchEvent)并向上返回处理情况(boolean值),若返回true,则上层不再处理。类似于冒泡方式 
于是难题出现了,你若把Touch Event都想办法给传到上层了(只能通过返回false来传到上层),那么下层的各种子View就不能处理后续事件了。而有的时候我们需要在下层和上层都处理Touch事件


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值