View的Touch事件分发(一)

View的Touch事件分发(一),第1张

View的Touch事件分发(一)

Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发。

一次完整的Touch事件序列为:

ACTION_DOWN -> ACTION_MOVE -> ACTION_UP

对于Touch事件的分发,不管是View还是ViewGroup都和以下的三个方法有关系:

dispatchTouchEvent():事件分发

onInterceptTouchEvent():事件拦截(ViewGroup才有该方法,View没有)

onTouchEvent():事件消费

现象:给一个控件设置OnTouchListener和OnClickListener,点击控件,会有以下3种结果:

1.OnTouchListener,OnTouchEvent,OnClickListener三个都有的情况下,OnTouchListener返回false :

OnTouchListener.DOWN -> OnTouchEvent.DOWN -> OnTouchListener.MOVE

-> OnTouchEvent.MOVE -> OnTouchListener.UP -> OnTouchEvent.UP -> OnClickListener

View的事件调度顺序是dispatchTouchEvent() -> onTouchListener() -> onTouchEvent() -> onLongCLick() -> onClick()

2.OnTouchListener,OnTouchEvent,OnClickListener三个都有的情况下 ,OnTouchListener返回true :

OnTouchListener.DOWN -> OnTouchListener.MOVE -> OnTouchListener.UP

只执行OnTouchListener,后续都不执行

3.OnTouch,OnClickListener前提是OnTouchEvent返回true :

OnTouchEvent.DOWN -> OnTouchEvent.MOVE -> OnTouchEvent.UP

不会执行OnClickListener

结论:

1.onTouchListener()的onTouch()方法的执行是优先于View的onTouchEvent()方法。

2.OnTouchListener的onTouch()方法返回了true,表示消费了touch事件,后续View的onTouchEvent(),onClick(),onLongClick()也就不会再执行了。

3.onClick(),onLongClick()等方法都是在onTouchEvnet()方法中进行执行的,ACTION_DOWN中处理长点击onLongClick(),ACTION_UP中处理点击onClick()。

4.如果View是未激活的,即处于DISABLED状态但是是可点击的(CLICKABLE LONG_CLICKABLE CONTEXT_CLICKALE),此时view也会消费掉touch事件,但是不会响应OnClickListener的onClick()方法,onLongClickListener的onLongCLick()方法

5.只要是View可点击的并且处于ENABLED状态,就一定返回true,即一定会消费touch事件。

6.onTouch(),onTouchEvent()中事件是否被消费了,由方法的返回值来决定,而不是由我们是否在方法中使用了touch事件MotionEvent来决定的。

后续会从源码来分析整个View的Touch事件分发过程

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存