0

I want to implement to change the fragment upon swiping upwards/downwards but all solution I find on the SO is just for RTL and even they are just saying to reverse the list/fragment. I want some solid method to implement it.

These are some of the links which I tried:

1) Changing viewPager swipe direction

2) Android change default direction swipe of ViewPager

3) how to make my viewpager swipe from right to left

4) how to reverse the direction of viewPager to left to right order?

5) Swipe Direction in ViewPager

6) Android OnTouch swipe up/down direction change

halfer
  • 19,824
  • 17
  • 99
  • 186
Mayank Doda
  • 117
  • 2
  • 11
  • Another alternative would be to take a look into Google's revamped ViewPager called `ViewPager2`: https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2. As far as I can tell from the javadoc, it looks there is a way to change the default orientation from horizontal to vertical with `.setOrientation(orientation)`. – Andy Res Jun 25 '19 at 18:05

1 Answers1

1

I had found this somewhere in the Big Google Ocean.

Let me know if it helps you.

public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        this(context, null);
    }

    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }

    @Override
    public boolean canScrollVertically(int direction) {
        return super.canScrollHorizontally(direction);
    }

    private void init() {
        setPageTransformer(true, new VerticalPageTransformer());
        setOverScrollMode(View.OVER_SCROLL_NEVER);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final boolean toIntercept = super.onInterceptTouchEvent(flipXY(ev));
        flipXY(ev);
        return toIntercept;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        final boolean toHandle = super.onTouchEvent(flipXY(ev));
        flipXY(ev);
        return toHandle;
    }

    private MotionEvent flipXY(MotionEvent ev) {
        final float width = getWidth();
        final float height = getHeight();
        final float x = (ev.getY() / height) * width;
        final float y = (ev.getX() / width) * height;
        ev.setLocation(x, y);
        return ev;
    }

    private static final class VerticalPageTransformer implements ViewPager.PageTransformer {
        @Override
        public void transformPage(View view, float position) {
            final int pageWidth = view.getWidth();
            final int pageHeight = view.getHeight();
            if (position < -1) {
                view.setAlpha(0);
            } else if (position <= 1) {
                view.setAlpha(1);
                view.setTranslationX(pageWidth * -position);
                float yPosition = position * pageHeight;
                view.setTranslationY(yPosition);
            } else {
                view.setAlpha(0);
            }
        }
    }
}

Use this same as you use your ViewPager. This will change it from Horizontal to Vertical .

Deˣ
  • 4,191
  • 15
  • 24
  • Thanks @Derek it worked. Hey, Can you help me on this https://stackoverflow.com/questions/56753847/i-have-webview-in-my-fragments-and-when-swiping-webview-than-viewpager-also-star – Mayank Doda Jun 25 '19 at 18:02