方法一:
问题来源:看过源码之后发现在onInterceptTouchEvent中的只要Y轴的移动距离大于• mTouchSlop这个值后就会触发下拉刷新的操作。深追之后发现这个值只有8dp,就是说• 当我们下滑了8dp的距离就会开始下拉刷新。那么找到了原因我们开始解决他把。
• -->> 解决方案:自定义一个SwipeRefreshLayout, 在它的onInterceptTouchEvent中,根据X 轴和Y 轴的 移动的距离差 如果xDis大于YDis•那么不拦截触摸事件,交给ViewPager处理。反之,交给SwipeRefreshLayout处理。
代码:
// 判断 X 轴的 Y 轴的 移动的距离差 来判断是否 需要拦截事件
public class MySwipeRefreshLayout extends SwipeRefreshLayout {
// 上一次触摸时的X坐标
private float mPreDownX;
private float mPreDownY;
public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mPreDownX = ev.getX();
mPreDownY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float eventX = ev.getX();
final float eventY = ev.getY();
float xAbs = Math.abs(eventX - mPreDownX);
float yAbs = Math.abs(eventY - mPreDownY);
// 如果 X 轴移动的 距离大于 Y 轴移动的距离
// 那么 不拦截 触摸事件 交给 下面的处理
if (xAbs > yAbs) {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
方法二:
ViewPager,设置OnTouchListener,里面当ACTION_MOVE的时候设置SwipeRefreshLayout不可用,
当ACTION_UP或者ACTION_CANCEL的时候设置SwipeRefreshLayout可以,就可以解决这个冲突了
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
swipeRefreshLayout.setEnabled(false);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
swipeRefreshLayout.setEnabled(true);
break;
}
return false;
}
});