事件分发机制
Android事件分发机制
ACTION_MOVE和ACTION_UP在传递的过程和ACTION_DOWN 不一样
ACTION_DOWN事件在哪个控件消费了(return true), 那么ACTION_MOVE和ACTION_UP就会从上往下(通过dispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传,如果ACTION_DOWN事件是在dispatchTouchEvent消费,那么事件到此为止停止传递,如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。
怎么处理滑动(事件)冲突,滑动冲突的原理
外部拦截,重写父容器onInterceptTouchEvent,也可以内部拦截比较麻烦
- 外部滑动方向与内部方向不一致:父容器拦截判断滑动方向
- 外部方向与内部方向一致:根据业务逻辑进行拦截
点击事件被拦截,但是想传到下面的View,如何操作?
getParent().requestDisallowInterceptTouchEvent(true);
-
在子View的dispatch..或onIntercept..中 DOWN 的时候调用 requestDisallow..(true),
-
别忘了,在UP或CANCEL的时候,requestDisallow..(false)
onTouchEvent如果返回false,onClick还会执行么?(58京东)
不会,测试发现button中onTouchEvent需消费掉点击事件才会触发onclick
onTouchListener、onTouchEvent、onClick的执行顺序。(58京东)
onTouch—–>onTouchEvent—>onclick
点击一个按钮后,事件分发机制说一下
-
NextActivity-dispatchTouchEvent:0
-
MyConstraintLayout-dispatchTouchEvent:0
-
MyConstraintLayout-onInterceptTouchEvent:0false
-
MyButton-dispatchTouchEvent:0
-
MyButton-onTouchEvent:0true
-
NextActivity-dispatchTouchEvent:1
-
MyConstraintLayout-dispatchTouchEvent:1
-
MyConstraintLayout-onInterceptTouchEvent:1false
-
MyButton-dispatchTouchEvent:1
-
MyButton-onTouchEvent:1true