1. 程式人生 > >解決Scrollview巢狀橫向recycleview滑動衝突問題

解決Scrollview巢狀橫向recycleview滑動衝突問題

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);
    }


}