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