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事件分发过程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)