我想在自定义ViewPager
中禁用转场的所有动画。
此视图分页器包含四个选项卡 - 每个选项卡加载Fragment
- 视图分页器的作用是切换选项卡:例如,第一个选项卡是索引,第二个是地图等。
问题是如果,作为第一个选择的标签,我点击第四个标签,我可以看到ViewPager
如何通过第二个和第三个标签并停在第四个标签上,我不知道希望这种情况发生。
每次用户选择要显示的新标签时,我都尝试停用此ViewPager
尝试使用setAnimation
到null
的所有动画,但它仍然没有工作
有任何想法要实现这一点吗? 非常感谢提前!
编辑:我还尝试覆盖每个onCreateAnimation
Fragment
,但仍无法正常工作
答案 0 :(得分:139)
我终于发现:只需使用mViewPager.setCurrentItem(position)
的额外参数调用false
就可以解决问题,这是ViewPager
的平滑滚动。
在此之后,滚动将完成而不进行任何平滑,因此不会看到动画。
答案 1 :(得分:44)
这是另一种解决方案:
代码段:
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, false);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item, false);
}
通过将 smoothScroll 设置为 false ,您将禁用滚动动画。
答案 2 :(得分:1)
我正在搜索禁用甚至用户滑动的滑动动画 这是我的实现
1-覆盖Viewpager
方法onInterceptTouchEvent
和onTouchEvent
2-创建自己的GestureDetector
3-检测滑动手势并使用setCurrentItem(item, false)
ViewPager
public class ViewPagerNoSwipe extends ViewPager {
private final GestureDetector gestureDetector;
private OnSwipeListener mOnSwipeListener;
public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
mOnSwipeListener = onSwipeListener;
}
public ViewPagerNoSwipe(@NonNull Context context) {
super(context);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public ViewPagerNoSwipe(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(context, new GestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return false;
}
public class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeRight();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeLeft();
}
result = true;
}
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeBottom();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public interface OnSwipeListener {
void onSwipeRight();
void onSwipeLeft();
void onSwipeTop();
void onSwipeBottom();
}
}
设置ViewPager时,设置swipeListener
postsPager.setOnSwipeListener(new ViewPagerNoSwipe.OnSwipeListener() {
@Override
public void onSwipeRight() {
postsPager.setCurrentItem(postsPager.getCurrentItem() + 1,false);
}
@Override
public void onSwipeLeft() {
postsPager.setCurrentItem(postsPager.getCurrentItem() - 1, false);
}
...
}
答案 3 :(得分:0)
在Tabselected侦听器中,只需设置 setCurrentItem 设置为false可禁用平滑滚动。
mBottomNavigation.setOnTabSelectedListener((position, wasSelected) -> {
switch (position) {
case 0:
viewPager.setCurrentItem(0, false);
return true;
case 1:
viewPager.setCurrentItem(1, false);
return true;
case 2:
viewPager.setCurrentItem(2, false);
return true;
}
return false;
});