您的位置:首页 > 移动开发 > Android开发

view 的滑动冲突

2016-01-20 17:45 387 查看
滑动冲突:顾名思义,就是滑动时产生的冲突。

原因:界面中有两层或者多层可以滑动。常见的滑动冲突场景:1、外部滑动方向和内部滑动方向不一致

常见的滑动冲突场景:
1、外部的滑动方向和内部的滑动方向不一致
2、外部的滑动方向跟内部的滑动方向一致
3、上面两种情况的嵌套

滑动冲突处理规则:

1、对于场景一,它的处理规则是:当用户左右滑动时,需要让外部的View拦截点击事件,但该用户上下滑动时,需要让内部拦截事件。而如何来确定它是一个上下滑动还是左右滑动呢?我们可以采取两种方法来判断
第一种方法:采取直角三角形来判断。

从起点滑动到终点,我们可以参考x、y的大小,也可以参考直角的两个夹角的大小,从而来判断是水平滑动还是上下滑动,其次,我们也可以通过滑动的速度Vx、Vy来判断,即相同时间内通过距离大小来判断(不过这种方法没有上面的方法常见,它适合于一些特定环境下)。

2、对于场景二、上述办法均不能解决,但是它往往可以从业务上找到突破点,比如业务上规定它处于某种状态时外部View相应用户滑动,而处于另外的状态时内部View 响应用户的滑动。

3、比较复杂

具体的解决方法:

注意:ViewPager比较特殊,它本身已经给我们做了相应的滑动冲突的解决,不用我们再去手动实现。

一、外部拦截法
所谓外部拦截法是指点击事件都通先经过父容器的拦截处理,如果父容器需哟此事件就拦截,不需要就不拦截,
这样就可以解决滑动冲突。这种方法比较符合点击事件的分发机制。外部拦截法需要重写父容器的onInterceptTouchEvent 方法,在内部拦截即可。

二、内部拦截法(感觉就像是外部拦截法的逆向思维)
内部拦截法是指父容器不拦截任何事件,所有事件都传递给子元素,如果子元素需要此事件就直接消耗,否则就交由父容器进行处理,这种方法和Android 的事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent 方法才能正常工作,使用起来较外部拦截法稍显复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息