viewpager应该可以说是我们项目中必备的一个组件了吧(希望不要打脸~),但有时候原生的组件并不能满足我们具体的业务需求,比如前段时间我就遇到一个场景,在viewpager滑动到特定页面的时候,可以控制它不能继续右滑了.等条件满足的时候,才可以继续滑动,这个时候,就需要我们自己对viewpager进行小小的修改,来满足我们的贪欲(产品狗的需求~)。
下面给大家一个可以控制滑动方向的viewpager,走你~
public class LimitSlideDirectionViewPager extends ViewPager {
private float initialXValue;
private SwipeDirection direction;
public LimitSlideDirectionViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.direction = SwipeDirection.ALL;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.IsSwipeAllowed(event)) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.IsSwipeAllowed(event)) {
return super.onInterceptTouchEvent(event);
}
return false;
}
private boolean IsSwipeAllowed(MotionEvent event) {
if(this.direction == SwipeDirection.ALL) return true;
if(direction == SwipeDirection.NONE )//disable any swipe
return false;
if(event.getAction()==MotionEvent.ACTION_DOWN) {
initialXValue = event.getX();
return true;
}
if(event.getAction()==MotionEvent.ACTION_MOVE) {
try {
float diffX = event.getX() - initialXValue;
if (diffX > 0 && direction == SwipeDirection.RIGHT ) {
// swipe from left to right detected
return false;
}else if (diffX < 0 && direction == SwipeDirection.LEFT ) {
// swipe from right to left detected
return false;
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
return true;
}
public void setAllowedSwipeDirection(SwipeDirection direction) {
this.direction = direction;
}
}
public enum SwipeDirection {
ALL, LEFT, RIGHT, NONE ;
}
首先定义一个枚举类 SwipeDirection,定义可运行的滑动方向
ALL:允许左右滑动
LEFT:允许左滑
RIGHT:允许右滑
NONE:不允许左右滑动
重写viewpager的onTouchEvent 和 onInterceptTouchEvent方法,通过IsSwipeAllowed方法来判断是否拦截事件或者消费事件~
在需要控制的地方调用 setAllowedSwipeDirection方法就ok了