如何禁止ViewPager左右滑動

一、使用自定義ViewPager

首先,我們可以考慮使用自定義的ViewPager來禁止左右滑動。自定義ViewPager其實就是繼承系統的ViewPager,然後重寫它的onTouchEvent方法。具體實現如下:

public class NoScrollViewPager extends ViewPager {
    private boolean noScroll = true;
    public NoScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NoScrollViewPager(Context context) {
        super(context);
    }
    public void setNoScroll(boolean noScroll) {
        this.noScroll = noScroll;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (noScroll) {
            return false;
        } else {
            return super.onTouchEvent(event);
        }
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (noScroll) {
            return false;
        } else {
            return super.onInterceptTouchEvent(event);
        }
    }
}

然後在使用該ViewPager時,設置noScroll為true即可:

NoScrollViewPager viewPager = findViewById(R.id.viewPager);
viewPager.setNoScroll(true);

二、使用反射禁止ViewPager滑動

除了使用自定義ViewPager以外,我們還可以使用反射來禁止ViewPager的滑動。具體實現如下:

try {
    Field mField = ViewPager.class.getDeclaredField("mScroller");
    mField.setAccessible(true);
    FixedSpeedScroller scroller = new FixedSpeedScroller(viewPager.getContext(), new AccelerateInterpolator());
    mField.set(viewPager, scroller);
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

其中,FixedSpeedScroller是自定義的Scroller,用於控制ViewPager的滑動速度。具體實現如下:

public class FixedSpeedScroller extends Scroller {
    private int mDuration = 500;
    public FixedSpeedScroller(Context context) {
        super(context);
    }
    public FixedSpeedScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }
    public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }
    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, mDuration);
    }
    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy, mDuration);
    }
    public void setDuration(int duration) {
        mDuration = duration;
    }
}

三、攔截touch事件

最後一種方式是攔截touch事件,當需要禁止左右滑動時,攔截touch事件,不讓ViewPager滑動。具體實現如下:

viewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = event.getX();
                downY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float moveX = event.getX() - downX;
                float moveY = event.getY() - downY;
                if(Math.abs(moveX) > Math.abs(moveY)){
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return false;
    }
});

總結

以上三種方式都可以實現ViewPager的禁止左右滑動,可以根據實際需求進行選擇。自定義ViewPager會涉及到對ViewPager的一些重寫,更靈活可控,但是相對較為複雜;使用反射、攔截touch事件則比較簡單,但是對ViewPager的改動比較有限。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/194320.html

相關推薦