Touch传递
-
Touch
事件先传递到Activity
,然后ViewGroup
,再传递到View
。 -
Touch
分发流程 :Activity.dispatchTouchEvent
->ViewGroup.dispatchTouchEvent
ViewGroup.onInterceptTouchEvent
->View.dispatchTouchEvent
->onTouch
->onTouchEvent
->onClick
-
dispatchTouchEvent()
的顺序是由上至下的。onTouchEvent()
是从下到上回溯的.前提是事件没有被消费的情况下。
ViewGroup和View不同
ViewGroup
没有重写onTouchEvent
,重写了dispatchTouchEvent
,多了onInterceptTouchEvent
函数。
onTouch和onClick优先级
onTouch()
优先级高于onClick()
,若onTouch()
消耗了事件(通常用return true;
表示),则onClick()
不执行。onTouchEvent()
中在ACTION_UP
即手指抬起时处理点击onClick()
事件
Clickable和Enable
-
enable
设置为false
,onClick()
和onTouch()
等方法完全屏蔽,onTouchEvent()
会被调用,但是View
中具体逻辑不执行。 -
enable
可通过设置boolean
值改变View
的状态。 -
setClickListener()
内部会设置setClickable()
为true
,所以最好setClicable()
显式放在setClickListener()
后面才会生效。
dispatchTouchEvent事件分发
- 当
dispatchTouchEvent
在进行事件分发的时候,通常只有前一个action
返回true
,才会触发后一个action
。对于dispatchTouchEvent
和onTouchEvent
,如果View
是可点击且Enable
为true
,那么onTouchEvent
会默认返回true
。 - 注意:
Button
默认Clickable
为true
,所以action
事件都会收到,而ImageView
默认Clickable
为false
,所以当onTouch
返回flase
时,则不会收到后续action
事件。
感想
以后尽量看源码,我有这么时间看详解,而且不一定每一篇博客都又详实又能满足我的需要,都能看源码看懂了。看N遍详解,不如看一遍源码...
网友评论