Android:当滑动冲突遇上RecyclerView

本文探讨了在Android中遇到RecyclerView滑动冲突时的解决策略,重点在于理解事件拦截逻辑和使用`parent.requestDisallowInterceptTouchEvent(false)`。通过分析源码,介绍了如何利用int变量来保存滑动状态,确保水平和竖直滑动逻辑不互相干扰,并提醒注意View的clickable属性及其对onTouchEvent的影响。最后,强调了正确获取parent的重要性。
摘要由CSDN通过智能技术生成

滑动冲突分析很简单,两种方法,外部拦截法,内部拦截法。

但是碰上RecyclerView后,我有点懵了。


主要是逻辑的问题,而不是什么拦截法的问题,当理顺了逻辑后,这才感到大彻大悟。


一开始是实现RecyclerView的item的水平监听。

这还不简单,可是做着做着,水平虽然滑动的很顺利,但是虽然点着鼠标不松开,试着上下滑动了一下,发现,这串事件被RecyclerView夺走了!重新水平滑动,发现我的水平逻辑全部失效了!


又跑去重新看了看源代码,还看了看RecyclerView的源代码,这才意识到,他的onIntercept中,把我这串事件,强行夺走了。


理顺了这个逻辑,才可以用得上内部拦截法了。


parent.requestDisallowInterceptTouchEvent(false);


这个方法,如果是true,就是不允许parent打断。false就是允许打断。


所以我用了一个boolean去判断,但是发现boolean根本满足不了需求。需求是,在这串事件的一开始,如果判定为水平,那么希望parent.requestDisallowInterceptTouchEvent(false);一直是处于false状态的。但是一个boolean明显不行。具体原因自行测试。


后来采用了int来保存。

move中

if (blockState == 0) {
    if (Math.abs(deltaX) < Math.abs(deltaY)) {
        blockState = 1;
    } else {
        blockState = 2;
    }
}

这样一个逻辑才算圆满。这个逻辑是代表只能进行判定一次。进行判定后,会判定本次是竖直滑动,还是水平滑动。再次进入move时候,由于已经赋值,所以不会再进行判断,弥补了boolean的缺陷。


这样一来,终于满足了需求:当本次判定为竖直的时候,水平的逻辑不可干预;本次判定为水平的时候,竖直的逻辑不可干预;全部代码如下

public class HorizontalSlideView extends FrameLayout {

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值