android 禁用ViewPager中的动画

wdebmtf2  于 2023-01-19  发布在  Android
关注(0)|答案(5)|浏览(243)

我想在我的自定义ViewPager中禁用所有过渡动画。此视图页包含四个选项卡-每个选项卡加载一个Fragment-视图页所做的是切换选项卡:例如,第一标签是索引,第二标签是Map,等等。
问题是,如果作为第一个选项卡,我单击第四个选项卡,我可以看到ViewPager如何通过第二个和第三个选项卡,并停止在第四个选项卡上,我不希望发生这种情况。
我尝试禁用此ViewPager的所有动画,尝试在每次用户选择要显示的新选项卡时使用setAnimationnull,但仍然不起作用。
请问有什么办法可以实现这个目标吗?先谢谢你了!
编辑:我还尝试为每个Fragment覆盖onCreateAnimation,但仍然不起作用

mlnl4t2r

mlnl4t2r1#

我终于发现:这个问题可以通过调用mViewPager.setCurrentItem(position)来解决,只需使用false的一个额外参数,这是ViewPager的平滑滚动。在此之后,滚动将在没有任何平滑的情况下完成,因此动画将不会被看到。

r8xiu3jd

r8xiu3jd2#

这里有另一个解决方案:

  • 子类化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,可以禁用滚动动画。

fkvaft9z

fkvaft9z3#

我正在搜索禁用滑动动画,甚至用户滑动,这里是我的实现
1-覆盖Viewpager方法onInterceptTouchEventonTouchEvent
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);

            }
             ...
           }
kiayqfof

kiayqfof4#

通过在分配查看寻呼机的位置时将平滑滚动设置为false解决了这个问题。这样,平滑滚动将不存在+动画将消失。

vpMain.setCurrentItem(position,false)
7eumitmz

7eumitmz5#

在tabselected侦听器中,只需将setCurrentItem的第二个参数设置为false,即可禁用平滑滚动。

mBottomNavigation.setOnTabSelectedListener((position, wasSelected) -> {
       
        viewPager.setCurrentItem(position, false);

        return true;
    });

相关问题