简介
-
dispatchTouchEvent()
用于管理View
的触摸事件:onClick()
、onLongClick()
、onTouch()
、onTouchEvent()
。
-
View
的触摸事件的调用顺序:onTouchListener() > onTouchEvent() > onLongClickListener() > onClickListener()
。
ViewGroup的事件分发
-
ViewGroup
的事件分发相对与View
来说就要麻烦一些。
- 当
ViewGroup
中有多个ChildView
时,把所有的ChildView
遍历一遍,如果触摸点在ChildView
区域内就分发给这个ChildView
。
- 若
ChildView
重叠导致触摸点在多个ChildView
里,一般会分配给显示在最上面的ChildView
。
陷阱
代码
<RelativeLayout
android:background="#CCC"
android:id="@+id/layout"
android:onClick="myClick"
android:layout_width="200dp"
android:layout_height="200dp">
<View
android:clickable="true"
android:layout_width="200dp"
android:layout_height="200dp" />
</RelativeLayout>
解说
-
RelativeLayout
的myClick
不会触发,因为View
设置为clickable
而被消耗了。
- 不论
View
自身是否注册点击事件,只要View
是可点击的就会消费事件。
- 事件是否被消费由返回值决定,
true
表示消费,false
表示不消费,与是否使用了事件无关。
注意事项
- 只要接受
ACTION_DOWN
就意味着接受所有的事件,拒绝ACTION_DOWN
则不会收到后续内容。
- 如果当前正在处理的事件被上层
View
拦截,会收到一个ACTION_CANCEL
,后续事件不会再传递过来。