Android 禁用ViewPager滚动动画

Android 禁用ViewPager滚动动画,android,animation,scroll,android-viewpager,native,Android,Animation,Scroll,Android Viewpager,Native,从代码中,我有一个设置适配器的ViewPager。有没有办法禁用滚动动画,使其在我滑动时“跳转”到新页面?我不想禁用onTouchEvent和oninterceptouchevent中的整个滚动功能,只想禁用滑动动画 mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (Cus

从代码中,我有一个设置适配器的ViewPager。有没有办法禁用滚动动画,使其在我滑动时“跳转”到新页面?我不想禁用
onTouchEvent
oninterceptouchevent
中的整个滚动功能,只想禁用滑动动画

mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (CustomViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);

我不知道是否有一个干净的解决方案。但是您可以使用一个技巧,用另一个转换器撤消标准页面转换器。
NoPageTransformer
如下所示:

private static class NoPageTransformer implements ViewPager.PageTransformer {
    public void transformPage(View view, float position) {
        if (position < 0) {
            view.setScrollX((int)((float)(view.getWidth()) * position));
        } else if (position > 0) {
            view.setScrollX(-(int) ((float) (view.getWidth()) * -position));
        } else {
            view.setScrollX(0);
        }
    }
}
将在SDK版本16及以上版本中工作。

Kotlin:

viewpager.setPageTransformer(false, FadePageTransformer())


inner class FadePageTransformer : ViewPager.PageTransformer {
    override fun transformPage(view: View, position: Float) {
        view.translationX = view.width * -position

        if (position <= -1.0f || position >= 1.0f) {
            view.alpha = 0.0f
            view.setVisibility(View.GONE);
        } else if (position == 0.0f) {
            view.alpha = 1.0f
            view.setVisibility(View.VISIBLE);
        } else {
            // position is between -1.0F & 0.0F OR 0.0F & 1.0F
            view.alpha = 1.0f - Math.abs(position)
            view.setVisibility(View.GONE);
        }
    }
}
viewpager.setPageTransformer(false,FadePageTransformer())
内部类FadePagetTransformer:ViewPager.PageTransformer{
覆盖页面(视图:视图,位置:浮动){
view.translationX=view.width*-位置
如果(位置=1.0f){
view.alpha=0.0f
view.setVisibility(view.GONE);
}否则如果(位置==0.0f){
view.alpha=1.0f
view.setVisibility(view.VISIBLE);
}否则{
//位置介于-1.0F和0.0F或0.0F和1.0F之间
view.alpha=1.0f-数学abs(位置)
view.setVisibility(view.GONE);
}
}
}

接受的答案仍然有一个滑动动画 我正在搜索禁用滑动动画,甚至由用户滑动 这是我的实现

1-覆盖
Viewpager
方法
onInterceptTouchEvent
onTouchEvent

2-创建自己的
手势检测器

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

            }
             ...
           }

私有静态类NoPageTransformer实现ViewPager.PageTransformer{
公共页面(@NonNull视图,浮动位置){
view.setTranslationX(view.getWidth()*-位置);
如果(位置=1.0f){
view.setVisibility(view.GONE);
}否则如果(位置==0.0f){
view.setVisibility(view.VISIBLE);
}否则{
view.setVisibility(view.GONE);
}
}
}

在else块中,您应该改为设置View.VISIBLE
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);

            }
             ...
           }
viewPager.setPageTransformer(false, new NoPageTransformer());
private static class NoPageTransformer implements ViewPager.PageTransformer {
    public void transformPage(@NonNull View view, float position) {
        view.setTranslationX(view.getWidth() * -position);
        if (position <= -1.0f || position >= 1.0f) {
            view.setVisibility(View.GONE);
        } else if (position == 0.0f) {
            view.setVisibility(View.VISIBLE);
        } else {
            view.setVisibility(View.GONE);
        }
    }
}