全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

如何禁止ViewPager左右滑动

发布时间:2023-11-25 13:08:12
发布人:xqq

一、使用自定义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的改动比较有限。

viewpager禁止滑动

相关文章

linux查询主力端口号,linux怎么查端口号

linux查询主力端口号,linux怎么查端口号

2023-11-25
java远程访问linux,java远程连接linux

java远程访问linux,java远程连接linux

2023-11-25
linuxnginx设置文件上传大小,linux文件大小限制

linuxnginx设置文件上传大小,linux文件大小限制

2023-11-25
linux查看交换机,linux查看交换机端口状态

linux查看交换机,linux查看交换机端口状态

2023-11-25

最新文章

武汉新媒体行业公司排名

武汉新媒体行业公司排名

2023-11-01
武汉新媒体就业现状好吗

武汉新媒体就业现状好吗

2023-11-01
武汉全媒体行业发展现状及趋势

武汉全媒体行业发展现状及趋势

2023-10-31
武汉全媒体现状

武汉全媒体现状

2023-10-31