web-dev-qa-db-fra.com

Désactiver l'animation dans ViewPager

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

49
noloman

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.

145
noloman

Voici une autre solution:

  • Sous-classe le ViewPager (votre personnalisé ViewPager)
  • Remplacez les deux méthodes setCurrentItem

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.

45
Toni

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);

            }
             ...
           }
1
tamtom

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;
    });
0
Dan