Touch分发的结论

2017-07-23  本文已影响12人  liaowenhao

Touch传递

  1. Touch事件先传递到Activity,然后ViewGroup,再传递到View
  2. Touch分发流程 : Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> onTouch -> onTouchEvent -> onClick
  3. dispatchTouchEvent()的顺序是由上至下的。onTouchEvent()是从下到上回溯的.前提是事件没有被消费的情况下。

ViewGroup和View不同

ViewGroup没有重写onTouchEvent,重写了dispatchTouchEvent,多了onInterceptTouchEvent函数。

onTouch和onClick优先级

onTouch()优先级高于onClick(),若onTouch()消耗了事件(通常用return true;表示),则onClick()不执行。onTouchEvent()中在ACTION_UP即手指抬起时处理点击onClick()事件

Clickable和Enable

  1. enable设置为falseonClick()onTouch()等方法完全屏蔽,onTouchEvent()会被调用,但是View中具体逻辑不执行。
  2. enable可通过设置boolean值改变View的状态。
  3. setClickListener()内部会设置setClickable()true,所以最好setClicable()显式放在setClickListener()后面才会生效。

dispatchTouchEvent事件分发

  1. dispatchTouchEvent在进行事件分发的时候,通常只有前一个action返回true,才会触发后一个action。对于dispatchTouchEventonTouchEvent,如果View是可点击且Enabletrue,那么onTouchEvent会默认返回true
  2. 注意:Button默认Clickabletrue,所以action事件都会收到,而ImageView默认Clickablefalse,所以当onTouch返回flase时,则不会收到后续action事件。

感想

以后尽量看源码,我有这么时间看详解,而且不一定每一篇博客都又详实又能满足我的需要,都能看源码看懂了。看N遍详解,不如看一遍源码...

参考

郭霖大神的分析(上)
郭霖大神的分析(下)
lfdfhl的分析,读前三篇就够了

上一篇下一篇

猜你喜欢

热点阅读