★60.自定义控件 ★18.事件分发机制详解
简介
-
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,后续事件不会再传递过来。
本文标题:★60.自定义控件 ★18.事件分发机制详解
本文链接:https://www.haomeiwen.com/subject/bmiicxtx.html
网友评论