我想禁用左右滑动,但只限制在向右侧的滑动。我在这篇答案中找到了可行的解决方案。不幸的是,这种方法复制了整个ViewPager
源代码来实现目标。有没有仅继承现有类而不重复代码的方法?
我想禁用左右滑动,但只限制在向右侧的滑动。我在这篇答案中找到了可行的解决方案。不幸的是,这种方法复制了整个ViewPager
源代码来实现目标。有没有仅继承现有类而不重复代码的方法?
我不确定这是否正是您所需要的: 我需要一个带有最大页数限制的向导视图。
最终解决方案在适配器中。 我更改了PagerAdapter的计数,以此阻止用户超过最大页面:
结果为:
我不确定这是否正是您所需要的: 我需要一个带有最大页数限制的向导视图。
最终解决方案在适配器中。 我更改了 PagerAdapter 的计数,以此阻止用户超过最大页面:
@Override
public int getCount() {
return mProgress; //max page + 1
}
当用户进入下一页时:private void setWizardProgress(int progress) {
if(progress > mProgress) {
mProgress = progress;
mWizardPagerAdapter.notifyDataSetChanged();
}
}
这样当用户到达最大页面时,他就不能向右滚动。
这里是具有禁用任何方向翻页功能的工作ViewPager类。查看所有答案。
public class CustomViewPager extends ViewPager {
private float initialXValue;
private SwipeDirection direction;
public CustomViewPager(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;
}
另一种简单的方法是使用setCurrentItem()在达到特定位置时滚动回所需的幻灯片。例如,这只允许向前滑动:
另一种简单的方法是使用setCurrentItem()在达到特定位置时滚动回所需的幻灯片。例如,这只允许向前滑动:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {
if(position < mProgress) {
mViewPager.setCurrentItem(mProgress, true);
} else {
mProgress = position;
}
}
@Override
public void onPageScrollStateChanged(int state) {}
});
或者,如果你想要有一个最大的幻灯片:
if(position > 4) {
mViewPager.setCurrentItem(4, true);
}
这个解决方案在技术上并不会完全禁用滑动,因为当您进行滑动操作时,您仍然会看到一小部分被禁止的幻灯片。但对于某些应用程序而言,这可能更受欢迎。
CustomViewPager
"的新自定义类。该类继承自"ViewPager
",并包含一个名为"setPagingEnabled
"的新定制方法,其目的是根据需要启用/禁用滑动功能。
步骤2:覆盖两个方法:"onTouchEvent
"和"onInterceptTouchEvent
"。如果要完全禁用分页,则两者都将返回"false
"。
步骤3:在布局文件中用自定义类替换"ViewPager
"标签。 <package_name.customviewpager
android:id="@+id/customViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Step 4: CustomViewPager.java
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled && detectSwipeToRight(event)) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled && detectSwipeToRight(event)) {
return super.onInterceptTouchEvent(event);
}
return false;
}
// To enable/disable swipe
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
// Detects the direction of swipe. Right or left.
// Returns true if swipe is in right direction
public boolean detectSwipeToRight(MotionEvent event){
int initialXValue = 0; // as we have to detect swipe to right
final int SWIPE_THRESHOLD = 100; // detect swipe
boolean result = false;
try {
float diffX = event.getX() - initialXValue;
if (Math.abs(diffX) > SWIPE_THRESHOLD ) {
if (diffX > 0) {
// swipe from left to right detected ie.SwipeRight
result = false;
} else {
// swipe from right to left detected ie.SwipeLeft
result = true;
}
}
}
catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
diffX
总是为正数,因此该方法从不返回 true
。 - WonderCsabobeginFakeDrag()
和endFakeDrag()
。beginFakeDrag()
,如果您想再次启用,请使用endFakeDrag()
。viewPager.beginFakeDrag();
private float initialXValue;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.mEnabled) {
return super.onTouchEvent(event);
}
if(event.getAction()==MotionEvent.ACTION_DOWN){
initialXValue = event.getX();
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
if(detectSwipeToRight(event)){
System.out.println("right swipe detected");
}
}
return true;
}
private boolean detectSwipeToRight(MotionEvent event) {
final int SWIPE_THRESHOLD = 100; // detect swipe
boolean result = false;
try {
float diffX = event.getX() - initialXValue;
if (Math.abs(diffX) > SWIPE_THRESHOLD) {
if (diffX < 0) {
// swipe from right to left detected ie.SwipeLeft
result = true;
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
ViewPager
库,我可以使用它。请注意,我想要动态地启用和禁用向右滑动,而不仅仅是静态地禁用它。 - WonderCsabo