
事件传递:
- 1.事件传递机制---源码。
- 2.处理事件的冲突。
一、View的事件分发。
首先我们看下下边的案例

I/AKyS: OnTouchListener:acton--0----AppCompatButton{dc64049 VFED..C.. ........ 0,0-1080,144 #7f0b005f app:id/button}
I/AKyS: OnTouchListener:acton--1----AppCompatButton{dc64049 VFED..C.. ...P.... 0,0-1080,144 #7f0b005f app:id/button}
I/AKyS: OnClickListener----AppCompatButton{dc64049 VFED..C.. ...P.... 0,0-1080,144 #7f0b005f app:id/button}
-
结论:
1.控件的Listener事件触发的顺序是先onTouch,再onClick。
2.控件的onTouch返回true,将会onClick事件没有了---阻止了事件的传递。
返回false,才会传递onClick事件(才会传递up事件) -
源码依据:
-
当我们手指按下去时,停止其他的滚动效果。
-
ListenerInfo,持有了View 的所有监听事件。
-
如果onTouchListener的onTouch方法返回了true,那么view里面的onTouchEvent就不会被调用了。
-
顺序dispatchTouchEvent-->onTouchListener---return false-->onTouchEvent
-
如果view为disenable,则:onTouchListener里面不会执行,但是会执行onTouchEvent(event)方法



-
onTouchEvent方法中的ACTION_UP分支中触发onclick事件监听
- onTouchListener-->onTouch方法返回true,消耗此事件。down,但是up事件是无法到达onClickListener.
- onTouchListener-->onTouch方法返回false,不会消耗此事件。
-
使用系统的button.给button添加touch和c lick监听,同时将OnTouch()返回值置为true.
结果:
结论: 消耗此事件。down,但是up事件是无法到达onClickListener. -
onTouchListener-->onTouch方法返回false
结果:

结论: onTouchListener-->onTouch方法返回false,不会消耗此事件。
此时我们将onTouchEvent中返回true.

结果: OnClick方法不执行了

在Activity中将OnTouch()方法置为false.同时在自定义View中将OnTouchEvent()置为true.结果如下:

结果:

结论: OnClick()方法没有执行。
- 在此基础上,如果在返回true之前,调用
super.onTouchEvent(event);
结果如下:

结论: 没有调用Super, 是无法出发OnClick()方法的。
- 如果我们在onTouchEvent()方法中返回是false.

结果如下:

结论:当我们返回false 时,不会在派发其他的动作。如果此时是Down事件,相应Down,但不消耗其他事件。交给父容器处理。
- 当我们该写dispatchTouchEvent()方法,返回true的时候。

结果如下:

结论: Button,调用super.dispatchTouchEvent(event);。默认返回的是true.
-
当我们该写dispatchTouchEvent()方法,返回false的时候
结果如下:

- View的事件分发
- 1.dispatchTouchEvent();
- 2.onTouchListener-->onTouch方法
- 3.onTouchEvent()
- 4.onClickListener-->onClick方法
总结:


网友评论