滑动冲突解决&事件分发机制

冲突类型:

第一类是外部和内部滑动方向不一致,第二类是外部和内部滑动方向一致,第三类是前两种嵌套的模式。

解决方案:

外部拦截法:

外部拦截法指点击事件首先都会经过父容器的拦截处理,父容器如果需要此事件就进行拦截,如果不需要此事件就不进行拦截,这样就可以解决滑动冲突问题。

内部拦截法:

内部拦截法指的是父容器不拦截任何事件,所有事件全部传递给子元素,如果子元素需要就进行消耗,否则交由父容器进行处理。


实践出真知

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来处理,则可实现左右滑动禁止,点击事件仍在。

事件分发机制-请参考我另一篇文章:事件分发机制原理

你可能感兴趣的:(滑动冲突解决&事件分发机制)