解決Scrollview巢狀橫向recycleview滑動衝突問題
阿新 • • 發佈:2019-01-04
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); } }