Recyclerview嵌套recyclerview滑动冲突解决(多指方案)

2022-07-29 08:25:56

情景:外层纵向,内层横向滑动

外层的纵向滑动recyclerview代码

publicclassQRecyclerViewextendsRecyclerView{privateint mStartX=0;privateint mStartY=0;privateint mTouchSlop=0;privateint mScrollPointerId=-1;publicQRecyclerView(@NonNull Context context){super(context);}publicQRecyclerView(@NonNull Context context,@Nullable AttributeSet attrs){super(context, attrs);
        mTouchSlop= ViewConfiguration.get(context).getScaledTouchSlop();}@OverridepublicbooleanonInterceptTouchEvent(MotionEvent ev){int action= ev.getAction();finalint actionIndex= ev.getActionIndex();switch(action){case MotionEvent.ACTION_DOWN:
                mScrollPointerId= ev.getPointerId(0);

                mStartX=(int)(ev.getX()+0.5f);
                mStartY=(int)(ev.getY()+0.5f);break;case MotionEvent.ACTION_POINTER_DOWN:
                mScrollPointerId= ev.getPointerId(actionIndex);//新落下的手指为滑动监听手指
                mStartX=(int)(ev.getX(actionIndex)+0.5f);
                mStartY=(int)(ev.getY(actionIndex)+0.5f);break;case MotionEvent.ACTION_MOVE:finalint index= ev.findPointerIndex(mScrollPointerId);finalint x=(int)(ev.getX(index)+0.5f);finalint y=(int)(ev.getY(index)+0.5f);float distanceX= Math.abs(x- mStartX);float distanceY= Math.abs(y- mStartY);if(distanceX> mTouchSlop&& distanceX> distanceY){//当横向滑动距离大于纵向滑动距离则不拦截事件returnfalse;}break;case MotionEvent.ACTION_POINTER_UP:onPointerUp(ev);break;case MotionEvent.ACTION_CANCEL:break;}returnsuper.onInterceptTouchEvent(ev);}privatevoidonPointerUp(MotionEvent e){finalint actionIndex= e.getActionIndex();if(e.getPointerId(actionIndex)== mScrollPointerId){// Pick a new pointer to pick up the slack.finalint newIndex= actionIndex==0?1:0;
            mScrollPointerId= e.getPointerId(newIndex);
            mStartX=(int)(e.getX(newIndex)+0.5f);
            mStartY=(int)(e.getY(newIndex)+0.5f);}}
  • 作者:Mr.QingBin
  • 原文链接:https://blog.csdn.net/congqingbin/article/details/102584487
    更新时间:2022-07-29 08:25:56