場景:
頁面布局采用NestedScrollView進行豎向滑動。内部嵌套了一個橫向滑動的RecyclerView。
問題:
當橫向滑動RecyclerView時,豎向滑動的NestedScrollView也會被滑動,互相幹擾。無法正常正常滑動。該如何解決滑動沖突?
解決方案:
第一步:重寫NestedScrollView,判斷當滑動事件在X軸移動時,不消費事件,交由子RecyclerView進行消費。當滑動事件在Y軸時NestedScrollView對事件進行消費。在需要使用NestedScrollView的地方,替換為重寫的MyNestedScrollView。
public class MyNestedScrollView extends NestedScrollView {
private int downX;
private int downY;
private int moveX;
private int moveY;
private int mTouchSlop;
public MyNestedScrollView(Context context) {
super(context);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public MyNestedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public MyNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) e.getRawX();
downY = (int) e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
moveY = (int) e.getRawY();
moveX = (int) e.getRawX();
if (Math.abs(moveX - downX) > mTouchSlop) {
return false;
}
}
return super.onInterceptTouchEvent(e);
}
}
第二步:給RecyclerView配置屬性setNestedScrollingEnabled(false)。設定嵌套滑動不可用。
recyclerView.setNestedScrollingEnabled(false);
完美解決。