1. 程式人生 > >ScrollView(Listview)和Viewpager(banner)的衝突解決辦法

ScrollView(Listview)和Viewpager(banner)的衝突解決辦法


原文地址:https://blog.csdn.net/qq_36255612/article/details/77987947

其實就是在onInterceptTouchEvent中做處理即可:

也可以直接使用下面的自定義:

public class MyScrollView extends ScrollView {

    private float xLast,yLast,xDistance,yDistance;

    // ScrollView的子View, 也是ScrollView的唯一一個子View
    private View contentView;

    // 用於記錄正常的佈局位置
    private Rect originalRect = new Rect();


    public MyScrollView(Context context) {
        super(context);
    }


    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            contentView = getChildAt(0);
        }
    }


    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);


        if (contentView == null)
            return;

        // ScrollView中的唯一子控制元件的位置資訊, 這個位置資訊在整個控制元件的生命週期中保持不變
        originalRect.set(contentView.getLeft(), contentView.getTop(),
                contentView.getRight(), contentView.getBottom());
    }

    /**
     * 在這裡解決滑動上下滑動,左右滑動衝突
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                xLast = ev.getX();
                yLast = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();

                xDistance += Math.abs(curX - xLast);
                yDistance += Math.abs(curY - yLast);
                xLast = curX;
                yLast = curY;

                if (xDistance > yDistance) {
                    return false;   //表示向下傳遞事件
                }
        }

        return super.onInterceptTouchEvent(ev);
    }
}

ListView 同上