情景:外层纵向,内层横向滑动
外层的纵向滑动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);}}