SwipeRefreshLayout和Viewpager的滑动冲突问题

方法一:

问题来源:看过源码之后发现在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;
             }
         });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值