冲突类型:
第一类是外部和内部滑动方向不一致,第二类是外部和内部滑动方向一致,第三类是前两种嵌套的模式。
解决方案:
外部拦截法:
外部拦截法指点击事件首先都会经过父容器的拦截处理,父容器如果需要此事件就进行拦截,如果不需要此事件就不进行拦截,这样就可以解决滑动冲突问题。
内部拦截法:
内部拦截法指的是父容器不拦截任何事件,所有事件全部传递给子元素,如果子元素需要就进行消耗,否则交由父容器进行处理。
实践出真知
1、ScrollView内嵌套RecyclerView同方向【竖向】
解决滑动冲突的方法:【默认解决了】
当点击RecyclerView之外区域并开始滑动时,ScrollView滑动,RecyclerView不动。
当点击RecyclerView内部区域并开始滑动时,RecyclerView滑动,并且可以超过RecyclerView范围,如果滑动到列表顶/底端,则ScrollView开始滑动。
2、ScorollView内嵌套RecyclerView不同方向【ScorollView竖向,RecyclerView横向】
跟上述1类似。
也就是说其内部已经做了滑动冲突处理。
经典场景:
使用TabLayout+ViewPager实现横向tab切换以及ViewPager的Fragment中List纵向滑动。
如果需要让其在滑动List的时候,不让顶部ViewPager+TabLayout切换,则就可以重写ViewPager的onIntercepterTouchEvent方法,让其返回false,意味着将滑动事件交由其子View:RecyclerView来处理,则可实现左右滑动禁止,点击事件仍在。
事件分发机制-请参考我另一篇文章:事件分发机制原理