滑动冲突分析很简单,两种方法,外部拦截法,内部拦截法。
但是碰上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 {