1、场景分析:
(1)场景:
下拉刷新包裹一个带head的listview,而head包含一个横向滑动的控件eg.ViewPager。测试会发现,ViewPager等横向控件左右手动滑动不太流畅。而且必须是严格的水平滑动(△x>0 ,△y=0)情况下,左右互动才会触发。
补充说明:
PtrClassicFrameLayout+RecyclerView:一组上拉加载下拉刷新组件。
ConvenientBanner:广告轮播控件,内部由ViewPager实现。
(2)原因:
在滑动监听时,只监听了坐标y的变化,只要y发生一点偏差,横向滑动的控件eg.ViewPager都不能左右滑动
2、解决方法:
理清上图流程,然后查看源码,在事件拦截dispatchTouchEvent(MotionEvent e)方法中我们会看到下面一段代码:
case MotionEvent.ACTION_MOVE:
mLastMoveEvent = e;
mPtrIndicator.onMove(e.getX(), e.getY());
float offsetX = mPtrIndicator.getOffsetX();
float offsetY = mPtrIndicator.getOffsetY();
if (mDisableWhenHorizontalMove && !mPreventForHorizontal && (Math.abs(offsetX) > mPagingTouchSlop && Math.abs(offsetX) > Math.abs(offsetY))) {
if (mPtrIndicator.isInStartPosition()) {
mPreventForHorizontal = true;
}
}
if (mPreventForHorizontal) {
return dispatchTouchEventSupper(e);
}
......
其中,mDisableWhenHorizontalMove 表示是否支持横向滑动,该值默认为false,也就是说滑动监听默认只会监听坐标y的变化。这里只要对外暴露一个方法,将其设置为true即可。
ps:其他的一些滑动冲突,也可以适当参考该方法。
相关知识参考 :
https://www.jianshu.com/p/1602d7207492
https://www.jianshu.com/p/de8ed145c384
http://blog.youkuaiyun.com/bear_huangzhen/article/details/50176075
其他:
SwipeRefreshLayout和ConvenientBanner 事件冲突解决 参考 http://blog.youkuaiyun.com/u010064206/article/details/50583991