事件分发机制

   

· Android中事件传递按照从上到下进行层级传递,事件处理从Activity开始到ViewGroup再到View

· 事件传递方法包括dispatchTouchEventonTouchEventonInterceptTouchEvent,其中前两个是ViewViewGroup都有的,最后一个是只有ViewGroup才有的方法。这三个方法的作用分别是负责事件分发、事件处理、事件拦截。

 

dispatchTouchEvent:它是传递触摸事件的接口。

(01) Activity将触摸事件传递给ViewGroup,ViewGroup将触摸事件传递给另一个ViewGroup或者ViewGroup将触摸事件传递给View;这些都是通过dispatchTouchEvent()来传递的。

(02) dispatchTouchEvent(), onInterceptTouchEvent(), onTouchEvent()以及onTouch()它们之间的联系,都是通过dispatchTouchEvent()体现的。它们都是在dispatchTouchEvent()中调度的!因此,理解dispatchTouchEvent()是理解Android事件机制的关键;而其中,最关键的就是ViewGroup中的dispatchTouchEvent()

(03) 返回值:true,表示触摸事件被消费了;false,则表示触摸事件没有被消费。

 

onInterceptTouchEvent:它是拦截触摸事件的接口。

(01) 只有ViewGroup中才有该接口。如果ViewGroup不想将触摸事件传递给它的子View,则可以在onInterceptTouchEvent中进行拦截。

(02) 返回值:true,表示ViewGroup拦截了该触摸事件;那么,该事件就不会分发给它的子View或者子ViewGroup。否则,表示ViewGroup没有拦截该事件,该事件就会分发给它的子View和子ViewGroup。

 

onTouchEvent:它是处理触摸事件的接口。

(01) 无论是Activity, ViewGroup还是View,对触摸事件的处理,基本上都是在onTouchEvent()中进行的。因此,我们说它是处理触摸事件的接口。

onTouchEvent方法是override 的Activity的方法。

重写了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。

(02) 返回值:返回true,表示触摸事件被它处理过了;或者,换句话说,表示它消费了触摸事件。否则,表示它没有消费该触摸事件。

 

OnTouchListener接口

OnTouchListener一个interface接口,它是在View中声明的。OnTouchListener中只包含了onTouch()函数。

onTouch方法是View的 OnTouchListener接口中定义的方法。

当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。

(当把手放到View上后,onTouch方法被一遍一遍地被调用)

 

那么,onTouch()和onTouchEvent()有什么相同和不同点呢?

相同点

onTouch()与onTouchEvent()都是用户处理触摸事件的API。

不同点

(01),onTouch()是View专门提供给用户的接口,目的是为了方便用户自己处理触摸事件。而onTouchEvent()是Android系统自己实现的接口。

(02),onTouch()的优先级比onTouchEvent()的优先级更高。

dispatchTouchEvent()中分发事件的时候,会先将事件分配给onTouch()进行处理,然后才分配给onTouchEvent()进行处理。 如果onTouch()对触摸事件进行了处理,并且返回true;那么,该触摸事件就不会分配在分配给onTouchEvent()进行处理了。只有当onTouch()没有处理,或者处理了但返回false时,才会分配给onTouchEvent()进行处理。

从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。

另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。

onTouch与onClick的关系

触摸事件返回true则不再执行点击事件







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值