事件传递中三个主要方法:
△dispathTouchEvent 分发事件
return true 表示该方法View内部消化掉了所有事件
return false 表示事件在本层不再继续进行分发,并交由上层控件的onTouchEvent()进行消费
return super.dispathTouchEvent 表示事件发送给本层的onInterceptTouchEvent
如果单纯返回true或false而不去执行super.dispathTouchEvent的话,将不会调用到同层级的onInterceptTouchEvent和onTouchEvent还有onTouch
△onInterceptTouchEvent 拦截事件(ViewGroup才有该方法)
return true 表示拦截事件,并交由本层的onTouchEvent()进行消费
return false/super.onInterceptTouchEvent 表示不拦截事件,发送给下层的dispathTouchEvent
△onTouchEvent 消费事件
return true 表示该事件被本控件消费了,事件传递结束
return false 表示事件没有被消费,交由上层控件的onTouchEvent()进行消费
View中super.onTouchEvent返回true;ViewGroup中super.onTouchEvent返回false
传递原则:
1.如果在某个层级(指某个控件及其子控件)没有处理ACTION_DOWN事件,则该层就再也收不到后续的Touch事件(ACTION_MOVE、ACTION_UP、ACTION_CANCEL),直到下一次ACTION_DOWN事件到来。
2.如果一个非ACTION_DOWN事件被父View拦截了,则那些上次处理了ACTION_DOWN的子View会收到一个ACTION_CANCEL,之后不会收到任何Touch事件,即使父View不再拦截后续的Touch。
3.如果父View决定处理Touch事件或子View没有处理Touch事件,则父View按照普通View的处理方式消费Touch事件,否则它不处理Touch,只负责分发。
4.如果父View在onInterceptTouchEvent中拦截了事件,则onInterceptTouchEvent中不会再收到Touch事件,而是直接交由它的onTouchEvent进行消费。
5.如果事件传递到某一层的子View的onTouchEvent上了,这个方法返回false,那么这个事件会从这个View往上传递,都是由onTouchEvent来接收,直到传给Activity的onTouchEvent方法为止。
实例图:
其中的MyTextView实现onTouchListener和onClickListener
补充事件与点击的关系:
ACTION_DOWN->onLongClick->ACTION_UP->onClick(onLongClick返回false还会调用onClick,反之不会)