您的位置:

如何禁止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的改动比较有限。

如何禁止ViewPager左右滑动

2023-05-18
如何禁止Android ViewPager滑动

2023-05-18
如何阻止ViewPager滑动 - 解决方法

2023-05-18
ios禁止侧滑js,ios如何禁止页面滑动

2022-11-23
Viewpager2禁止滑动的多个方面分析

2023-05-20
移动端滑动事件详解

2023-05-20
Swiper禁止手动滑动完全解读

2023-05-20
Android ViewPage: 初识多页面滑动

2023-05-20
js移动端触摸事件完整代码,移动端触屏事件

本文目录一览: 1、JS移动端获取触控位置 2、javascript 在移动端怎么做到左右触摸事件 ontouchmove吗?求代码 3、如何js实现触屏点击事件 JS移动端获取触控位置 1、如图位置

2023-12-08
破解网页右键被禁止js(鼠标右键被禁用怎么解除?)

本文目录一览: 1、【引用】网页右键禁用不能复制怎么办 2、如何破解用js来限制的鼠标右键 3、网页内容不允许复制,鼠标右键被屏蔽,如何解决 【引用】网页右键禁用不能复制怎么办 还不弹出的不能复制的对

2023-12-08
如何删除网页禁止右键的js代码,js禁止浏览器右键

本文目录一览: 1、如何用jquery或者插件解除网页禁用右键复制的限制 2、如何解除网页不能用鼠标右键的限制? 3、保存下来一个网页,但是右键审查元素时,不能右键,怎么修改代码,还是说去掉js? 如

2023-12-08
Android ViewPager优化实践:提高界面流畅度

Android应用中,ViewPager是一个极其常用的控件,它可以帮助我们实现多页面滑动浏览的效果。但在使用时,我们经常会遇到ViewPager卡顿、滑动不流畅的问题,这不仅会影响用户的使用体验,更

2023-12-08
java学习笔记(java初学笔记)

2022-11-14
js实现ios右滑返回上一页,苹果左滑返回上一页

本文目录一览: 1、苹果手机怎么设置右滑返回上一界面 2、iphone13怎么设置右滑返回上一层 3、js返回上一页并刷新的几种方法 4、iphone怎么设置右滑返回 5、iOS app 右滑返回 苹

2023-12-08
深入了解PagerAdapter

2023-05-20
js当前禁止了右键默认菜单,如何恢复右键默认菜单的简单介绍

2022-11-30
印象笔记记录java学习(Java成长笔记)

2022-11-12
提升移动应用导航栏用户体验的法宝——TabLayout和Vi

2023-05-14
手机滑动js代码(js触摸滑动)

本文目录一览: 1、js css 怎样设置手机能滑动页面 2、手机app滑动轮播原生js怎么写 3、如何用js做到滑动效果 4、怎么用js实现类似手机切屏的左右滑动的效果 5、页面实现滑动JS代码 j

2023-12-08
CSS禁止选中

2023-05-18