android 滑动冲突

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_beicai/article/details/83302739

在android开发中会经常遇到各种问题,比较常见之一就有滑动冲突问题,只要出现滑动冲突,demo或者项目就无法正常工作,

那么问题是滑动冲突时怎么产生的,我们又应该如何解决这个滑动冲突问题那,其实在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突,我们如何解决这个问题呢?这是一个简单又复杂的问题,简单因为滑动冲突有固定的解决办法,下面就分析一下滑动冲突,

1.我们常见的滑动冲突场景

@1. 场景一:

外部滑动方向和内部滑动方向不一致,(外部上下,内部左右)

主要是讲ViewPager和Fragment配合使用所组成的页面效果,主流的应用几乎都是使用这个效果,我们可以通过左右滑动来切换页面,每个页面又是一个上下滑动的列表,这种情况下是有滑动冲突的,但是ViewPager内部处理了这种滑动冲突,除了这种典型的案例之外,还存在其他情况,比如外部上下滑动,内部左右滑动,但是他们属于同一种滑动冲突。

@2. 场景二:

外部滑动方向和内部滑动方向一致 (内部上下 外部上下)

这种情况会相对于复杂一些,当内外两层都在同一方向可以滑动的时候,当我们手指开始滑动的时候,系统是无法知道用户到底希望哪一层是滑动的,因为只能有一层可以滑动,要么是内层,要么是外层,

@3. 场景三:

上面情况的嵌套模式(具体不追诉)

这种情况属于场景一和场景二的嵌套实现,看起来场景三更复杂一些,只要我们理解他的滑动冲突规则,一个一个解决,是挺简单的。

2.处理规则

我们比较常见的是场景一和场景二,场景三是比较不常见的,并不代表不会出现,一点出现,按照场景一的规则一步一步处理,其实原理一样,本文中就不追诉场景三了。

场景一:

当用户左右滑动时,需要外部的view拦截点击事件,当用户上下滑动时,需要让内部的View拦截点击事件(就是水平还是竖直滑动时解决滑动冲突)

场景二:

我们无法根据滑动的角度距离差来做判断,通过业务上找突破口,另一种状态时,内部View来相应View的滑动事件。

3.滑动冲突的具体解决办法

我们通过内部拦截和外部拦截解决滑动冲突。

1)外部拦截:

点击事件先经过父容器的拦截处理,如果父容器需要此事件就拦截,不需要此事件就不拦截,

(外部拦截法需要重写父容器的OnIntertptTouchEvent方法在内部做相应的拦截即可)

2)外部拦截:

内部拦截就是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消费掉,否则交父容器进行处理。(我们重写子元素的dispatchTouchEvent方法,内部拦截法与事件分发机制不一致,需要配合ReustDisallowInterpetTOuchEvent方法正常工作,)

内部拦截法没有外部拦截法简单易用,建议大家使用外部拦截法,进行解决滑动冲突事件。

猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/83302739