一、使用自定義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