千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 如何禁止ViewPager左右滑动

如何禁止ViewPager左右滑动

来源:千锋教育
发布人:xqq
时间: 2023-11-25 13:08:12 1700888892

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

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT