Подтвердить что ты не робот

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

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

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

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

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

EDIT: Я также попытался переопределить onCreateAnimation для каждого Fragment, но все еще не работает

4b9b3361

Ответ 1

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

Ответ 2

Здесь другое решение:

  • Подкласс 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, вы отключите анимацию прокрутки.

Ответ 3

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

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

            }
             ...
           }

Ответ 4

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