View的滑动冲突
参考Android 8.0 源码
在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突。
常见的滑动冲突场景
常见的滑动冲突场景可以分为以下三种:
场景1 . 外部滑动方向和内部滑动方向不一致:
主要是将ViewPager和Fragment配合使用所组成的页面滑动效果。在这种效果中呢,可以通过左右滑动来切换页面,而每个页面内部往往又是一个ListView。本来这种情况下是有滑动冲突的,但是ViewPager内部处理了这种滑动冲突,因此采用ViewPager时,我们无需关注这个问题。
如果我们采用的不是ViewPager,而是ScrollView等,那就必须手动处理滑动冲突了,否则造成的后果就是内外两层只能有一层能够滑动。
除了这种典型情况外,还存在其他情况,比如外部上下滑动、内部左右滑动。
场景2 . 外部滑动方向和内部滑动方向一致:
当内外两层都在同一个方向可以滑动的时候,显然存在逻辑问题,因为当手指开始滑动的时候,系统无法知道用户到底是让哪一层滑动,所以当手指滑动的时候就会出现问题。要么只有一层能滑动,要么就是内外两层都滑动得很卡顿。在实际开发中,这种场景主要是指内外两层同时能上下滑动或者内外两层同时能左右滑动。
场景3 . 上面两种情况的嵌套:
滑动冲突的处理规则
一般来说,不管滑动冲突多复杂,都有既定的规则,根据这些规则就可以选择合适的方法去处理。
场景1的处理规则
这里我们以外部左右滑动、内部上下滑动来举例。
这种情况下的处理规则是:当用户左右滑动时,需要让外部的View拦截点击事件,当用户上下滑动时,需要让内部View拦截点击事件。具体来说,就是根据滑动是水平滑动还是竖直滑动来判断到底由谁来拦截事件。根据滑动过程中两个点之间的坐标就可以得出到底是水平滑动还是竖直滑动。比如,可以根据滑动路径与水平方向所形成的夹角,也可以根据水平方向和竖直方向上的距离差来判断,在某些特殊情况下还可以根据水平和竖直方向的速度差来判断。
场景2的处理规则
对于场景2来说,无法根据滑动的角度、距离差以及速度差来做判断,但是这个时候一般都能在业务上找到突破点。比如业务上有规定:当处于某种状态时需要外部View响应用户的滑动,而处于另外一种状态时则需要内部View来响应用户的滑动。根据这种业务上的需求,我们也能得出相应的处理规则,有了处理规则同样可以进行下一步的处理了。
场景3的处理规则
对于场景3来说,滑动规则更加复杂。和场景2亿牙膏,无法直接根据滑动的角度、距离差以及速度差来做判断,同样还是只能从业务上找到突破点,需要从业务的需求上得出相应的处理规则。
滑动冲突的解决方式
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------last line for now------------------