While implementing a fun Android app, I came across a scenario where the ViewPager should only be swiped right-to-left. Visiting back should be restricted. Also at some points, I needed to lock the whole view pager so that it cannot be swiped at any direction.
The following code shows how I did it by extending the ViewPager class. Note that I was using the support library.
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class OneWayLockableViewPager extends ViewPager {
private boolean enabled;
private float lastX;
public OneWayLockableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
boolean lockScroll;
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
lockScroll = lastX <= event.getX();
break;
default:
lockScroll = false;
lastX = event.getX();
break;
}
return lockScroll ? false : super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void lock() {
this.enabled = false;
}
public void unlock() {
this.enabled = true;
}
}
It is quite easy to change it if you want to reverse the allowed direction of swiping. Just change the less than or equal sign to a greater than sign in line number 21.
Also when you want to lock down the whole view pager, just call the lock() method and swiping will be disabled.
No comments:
Post a Comment