Disable ViewPager scrolling animation

后端 未结 4 1959
执笔经年
执笔经年 2020-12-18 06:54

From the code here, I have a ViewPager that sets an adapter. Is there any way to disable the scrolling animation so that it just \"jumps\" to the new page when I swipe? I\'m

相关标签:
4条回答
  • 2020-12-18 07:32

    I do not know if there is a clean solution. But you can use a trick and undo the standard page transformer with another transformer. The NoPageTransformer would look like this:

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

    To add it to your ViewPager, call:

    mViewPager.setPageTransformer(false, new NoPageTransformer());
    

    Will work in SDK version 16 and above.

    0 讨论(0)
  • 2020-12-18 07:34

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-18 07:44

    the accepted answer still have a swipe animation I was searching for disabling the swipe animation even swipe by the user here is my implementation

    1-Override Viewpager method onInterceptTouchEvent and onTouchEvent

    2- create your own GestureDetector

    3- detect the swipe gesture and use the 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();
        }
    }
    

    the when you are set up the ViewPager set the 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);
    
                }
                 ...
               }
    
    0 讨论(0)
  • 2020-12-18 07:49
    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题