版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangwenbo1019/article/details/85773984
1.重写Scrollview,拦截竖向滑动,不拦截横向滑动
public class CustomScrollview extends ScrollView { private float mLastXIntercept = 0f; private float mLastYIntercept = 0f; public CustomScrollview(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercepted = false; float x = ev.getX(); float y = ev.getY(); int action = ev.getAction() & MotionEvent.ACTION_MASK; switch (action) { case MotionEvent.ACTION_DOWN: { intercepted = false; //初始化mActivePointerId super.onInterceptTouchEvent(ev); break; } case MotionEvent.ACTION_MOVE: { //横坐标位移增量 float deltaX = x - mLastXIntercept; //纵坐标位移增量 float deltaY = y - mLastYIntercept; if (Math.abs(deltaX) < Math.abs(deltaY)) { intercepted = true; } else { intercepted = false; } break; } case MotionEvent.ACTION_UP: { intercepted = false; break; } } mLastXIntercept = x; mLastYIntercept = y; return intercepted; } }
2.重写recycleview 消耗父控件不拦截的事件
public class HorizontalRecycleview extends RecyclerView { private float mLastXIntercept = 0f; private float mLastYIntercept = 0f; public HorizontalRecycleview(Context context) { super(context); } public HorizontalRecycleview(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int x = (int) ev.getX(); int y = (int) ev.getY(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: { getParent().requestDisallowInterceptTouchEvent(true); break; } case MotionEvent.ACTION_MOVE: { //横坐标位移增量 float deltaX = x - mLastXIntercept; //纵坐标位移增量 float deltaY = y - mLastYIntercept; if (Math.abs(deltaX) < Math.abs(deltaY)) { getParent().requestDisallowInterceptTouchEvent(false); } break; } case MotionEvent.ACTION_UP: { break; } } return super.dispatchTouchEvent(ev); } }