Отключение анимации в ViewPager

Я хотел бы отключить все анимации для переходов в моем пользовательском файле ViewPager. Этот пейджер просмотра содержит четыре вкладки, и каждая вкладка загружает Fragment-, и что делает пейджер просмотра, так это переключает вкладки: например, первая вкладка — это указатель, вторая — карта и т. д.

Проблема в том, что если, будучи выбранной первой вкладкой, я нажимаю на четвертую вкладку, я вижу, как ViewPager проходит через вторую и третью вкладки и останавливается на четвертой, и я не хочу, чтобы это произошло.

Я попытался отключить все анимации для этого ViewPager, пытаясь использовать от setAnimation до null каждый раз, когда пользователь выбирает новую вкладку для отображения, но это все еще не работает.

Любая идея для достижения этого, пожалуйста? Заранее большое спасибо!

РЕДАКТИРОВАТЬ: я также пытался переопределить onCreateAnimation для каждого Fragment, но все еще не работал


person noloman    schedule 04.02.2013    source источник
comment
Вы имеете в виду, что хотите также удалить возможность жестов смахивания, я понимаю. Если это так, попробуйте создать новый проект для версии 4.0+ в Eclipse, это позволит вам создать пустой проект с вкладками как с возможностью сдвига, так и без него, проверить различия, это самый быстрый способ, и вы можете увидеть много кода.   -  person MariusBudin    schedule 04.02.2013
comment
ну, на самом деле мы не можем сейчас провести по горизонтали, так как клиенту это не понравилось, поэтому я просто хочу удалить анимацию (пролистывание уже отключено)   -  person noloman    schedule 04.02.2013
comment
см. мой ответ здесь - stackoverflow.com/a/54571100/4891063   -  person Alexey Timokhin    schedule 07.02.2019


Ответы (4)


Наконец-то я узнал: проблему можно решить, просто вызвав mViewPager.setCurrentItem(position) с дополнительным параметром для false, который является плавной прокруткой для ViewPager. После этого прокрутка будет выполняться без какого-либо сглаживания, и поэтому анимация не будет видна.

person noloman    schedule 04.02.2013
comment
@JayVDiyk Пример. при нажатии кнопки вызовите это так: mViewPager.setCurrentItem(position, false); - person vovahost; 03.01.2016
comment
Любой, кто занимается этим, также может быть заинтересован в этом: stackoverflow.com/a/13437997/3075340 - person Micro; 10.07.2016
comment
Спасибо за разъяснение... Я использовал его с true; думая, что гладкость уберет зависание. Я злоупотреблял этим .... :( - person Amt87; 08.12.2016
comment
Обратите внимание, что текущая реализация setCurrentItem(int item) использует smoothScroll true (кроме первого макета). - person hmac; 25.03.2019

Вот еще одно решение:

  • Подкласс ViewPager (ваш собственный ViewPager)
  • Переопределите два метода setCurrentItem.

Фрагмент кода:

@Override
public void setCurrentItem(int item, boolean smoothScroll) {
    super.setCurrentItem(item, false);
}

@Override
public void setCurrentItem(int item) {
    super.setCurrentItem(item, false);
}

Установив для smoothScroll значение false, вы отключите анимацию прокрутки.

person Toni    schedule 16.02.2016
comment
Почему мы хотим создать подкласс ViewPager, если он уже предоставляет эту перегрузку? - person user1032613; 04.11.2018
comment
@ user1032613, потому что текущая реализация setCurrentItem(int item) использует smoothScroll true (кроме первого макета) - person hmac; 25.03.2019
comment
В viewpager2 класс viewpager является окончательным, поэтому его нельзя переопределить. - person Raghav Sharma; 15.04.2020

Я искал отключение анимации смахивания, даже смахивание пользователем, вот моя реализация

1-Переопределить Viewpager метод onInterceptTouchEvent и onTouchEvent

2- создайте свой собственный GestureDetector

3- обнаружить жест смахивания и использовать setCurrentItem(item, false)

Вьюпейджер

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

            }
             ...
           }
person tamtom    schedule 31.01.2019

В прослушивателе 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;
    });
person EngineerDanny    schedule 15.08.2019