Je voudrais désactiver toutes les animations pour les transitions dans mon ViewPager
personnalisé. Ce pager de vue contient quatre onglets -et chaque onglet charge un Fragment
- et ce que le pager de vue fait est de changer les onglets: par exemple, le premier onglet est l'index, le second est la carte, etc.
Le problème est que si, étant le premier onglet choisi, je clique sur le quatrième onglet, je peux voir comment le ViewPager
traverse les deuxième et troisième onglets et s'arrête sur le quatrième, et je ne veux pas que se passer.
J'ai essayé de désactiver toutes les animations pour ce ViewPager
en essayant d'utiliser un setAnimation
à null
chaque fois que l'utilisateur choisit un nouvel onglet à afficher, mais ce n'est toujours pas le cas travail.
Une idée pour y parvenir, s'il vous plaît? Merci beaucoup d'avance!
EDIT: J'ai également essayé de remplacer onCreateAnimation
pour chaque Fragment
mais ne fonctionnait toujours pas
J'ai finalement découvert: le problème peut être résolu en appelant simplement la mViewPager.setCurrentItem(position)
avec un paramètre supplémentaire à false
, qui est le défilement fluide du ViewPager
. Après cela, le défilement se fera sans aucun lissage et donc les animations ne seront pas vues.
Voici une autre solution:
Extrait de code:
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, false);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item, false);
}
En définissant smoothScroll sur false, vous désactivez l'animation de défilement.
Je cherchais à désactiver l'animation de balayage même glisser par l'utilisateur ici est mon implémentation
1-Override Viewpager
méthode onInterceptTouchEvent
et onTouchEvent
2- Créez votre propre GestureDetector
3- Détectez le geste de glissement et utilisez la fonction 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();
}
}
le lorsque vous êtes configuré le ViewPager définir le 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);
}
...
}
Dans l'écouteur sélectionné par tabulation, définissez simplement le deuxième argument de setCurrentItem sur false pour désactiver le défilement fluide.
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;
});