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; } }
mLastXIntercept = x; mLastYIntercept = y;
return super.dispatchTouchEvent(ev); } }