view 的滑动冲突

滑动冲突:顾名思义,就是滑动时产生的冲突。

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


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



滑动冲突处理规则:

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

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

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

3、比较复杂

具体的解决方法:

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

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


二、内部拦截法(感觉就像是外部拦截法的逆向思维)
内部拦截法是指父容器不拦截任何事件,所有事件都传递给子元素,如果子元素需要此事件就直接消耗,否则就交由父容器进行处理,这种方法和Android 的事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent 方法才能正常工作,使用起来较外部拦截法稍显复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值