美文网首页
解决RecyclerView嵌套横向滑动RecyclerView

解决RecyclerView嵌套横向滑动RecyclerView

作者: 消失的象 | 来源:发表于2017-06-02 17:40 被阅读0次

    主要是重写RecyclerView的onInterceptTouchEvent方法
    话不多说直接上代码:

    public class CustomRecyclerView extends RecyclerView{
    
      private static final int INVALID_POINTER = -1;
      private int mScrollPointerId = INVALID_POINTER;
      private int mInitialTouchX, mInitialTouchY;
      private int mTouchSlop;
    
      public CustomRecyclerView (Context context) {
        this(context, null);
      }
    
      public CustomRecyclerView (Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
      }
    
      public CustomRecyclerView (Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        final ViewConfiguration vc = ViewConfiguration.get(getContext());
        mTouchSlop = vc.getScaledTouchSlop();
      }
    
      @Override
      public void setScrollingTouchSlop(int slopConstant) {
        super.setScrollingTouchSlop(slopConstant);
        final ViewConfiguration vc = ViewConfiguration.get(getContext());
        switch (slopConstant) {
          case TOUCH_SLOP_DEFAULT:
            mTouchSlop = vc.getScaledTouchSlop();
            break;
          case TOUCH_SLOP_PAGING:
            mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(vc);
            break;
          default:
            break;
        }
      }
    
      @Override
      public boolean onInterceptTouchEvent(MotionEvent e) {
        final int action = MotionEventCompat.getActionMasked(e);
        final int actionIndex = MotionEventCompat.getActionIndex(e);
    
        switch (action) {
          case MotionEvent.ACTION_DOWN:
            mScrollPointerId = MotionEventCompat.getPointerId(e, 0);
            mInitialTouchX = (int) (e.getX() + 0.5f);
            mInitialTouchY = (int) (e.getY() + 0.5f);
            return super.onInterceptTouchEvent(e);
    
          case MotionEventCompat.ACTION_POINTER_DOWN:
            mScrollPointerId = MotionEventCompat.getPointerId(e, actionIndex);
            mInitialTouchX = (int) (MotionEventCompat.getX(e, actionIndex) + 0.5f);
            mInitialTouchY = (int) (MotionEventCompat.getY(e, actionIndex) + 0.5f);
            return super.onInterceptTouchEvent(e);
    
          case MotionEvent.ACTION_MOVE: {
            final int index = MotionEventCompat.findPointerIndex(e, mScrollPointerId);
            if (index < 0) {
              return false;
            }
    
            final int x = (int) (MotionEventCompat.getX(e, index) + 0.5f);
            final int y = (int) (MotionEventCompat.getY(e, index) + 0.5f);
            if (getScrollState() != SCROLL_STATE_DRAGGING) {
              final int dx = x - mInitialTouchX;
              final int dy = y - mInitialTouchY;
              final boolean canScrollHorizontally = getLayoutManager().canScrollHorizontally();
              final boolean canScrollVertically = getLayoutManager().canScrollVertically();
              boolean startScroll = false;
              if (canScrollHorizontally && Math.abs(dx) > mTouchSlop && (Math.abs(dx) >= Math.abs(dy) || canScrollVertically)) {
                startScroll = true;
              }
              if (canScrollVertically && Math.abs(dy) > mTouchSlop && (Math.abs(dy) >= Math.abs(dx) || canScrollHorizontally)) {
                startScroll = true;
              }
              return startScroll && super.onInterceptTouchEvent(e);
            }
            return super.onInterceptTouchEvent(e);
          }
    
          default:
            return super.onInterceptTouchEvent(e);
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:解决RecyclerView嵌套横向滑动RecyclerView

          本文链接:https://www.haomeiwen.com/subject/fqvufxtx.html