美文网首页
View的滑动冲突问题

View的滑动冲突问题

作者: 浪里_个郎 | 来源:发表于2020-06-06 01:27 被阅读0次

问题描述:
RecyclerView在滑动至最后一个item时, 继续向左滑动RecyclerView将不再消费消息,消息向上传递,会触发外层的ViewPager的滑动。需要避免该情况。
宽泛的说,是如何控制消息被指定的View消费。

Android的事件传递,是从父-子,如果父View没有拦截,那么是否消费事件的决定权就在子节点,如果子节点消费了事件,事件就不再传递到父节点了。
关于消息传递和拦截,以下三个函数我们比较熟悉:

dispatchTouchEvent(MotionEvent ev): 用来分发触摸事件
onInterceptTouchEvent(MotionEvent ev): 事件的拦截, ViewGroup独有, 在dispatchTouchEvent()中调用
onTouchEvent(MotionEvent ev): 用来处理点击事件

因为父View无法知道子View什么时候不消费事件,所以需要在子View中进行控制。


消息拦截

参考上图,dispatchTouchEvent每次接受到点击事件时,会初始化触摸状态,然后判断disallowIntercept是否为true,如果为true,不执行onInterceptTouchEvent。
父View的disallowIntercept,可以由子View调用parent.requestDisallowInterceptTouchEvent来控制。所以,子View可以在任意地方,控制父View是否拦截消息。
有一点需要注意,原生的onInterceptTouchEvent方法实现,并不会直接拦截所有事件(需要满足yDiff>mTouchSlop),所以子View仍然有机会获取事件,并调用parent.requestDisallowInterceptTouchEvent

相关文章

网友评论

      本文标题:View的滑动冲突问题

      本文链接:https://www.haomeiwen.com/subject/tvqttktx.html