0

I want my vertical stack look-alike Viewpager to work inside a horizontal Viewpager. Here is my code for the Transformer (the Basetransformer is from https://github.com/geftimov/android-viewpager-transformers/blob/master/android-viewpager-transformers/src/main/java/com/eftimoff/viewpagertransformers/BaseTransformer.java) :

import android.view.View;

import com.eftimoff.viewpagertransformers.BaseTransformer;

public class VerticalStackTransformer extends BaseTransformer {

    @Override
    protected void onTransform(View view, float position) {
//        Log.d("VST"," position "+position);
        view.setTranslationX(view.getWidth() * -position);
        view.setTranslationY(position < 0 ? position * view.getHeight() : 0f);
    }
}

and here is my version for the vertical Viewpager:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

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

    private void init() {
        // The majority of the magic happens here
        setPageTransformer(true, new VerticalStackTransformer());
        // The easiest way to get rid of the overscroll drawing that happens on the left and right
        setOverScrollMode(OVER_SCROLL_NEVER);
    }


    /**
     * Swaps the X and Y coordinates of your touch event.
     */
    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();

        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;

        ev.setLocation(newX, newY);

        return ev;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev){

        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev); // return touch coordinates to original reference frame for any child views
        return intercepted;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }
}

My code works properly in terms of scrolling up and down. The only problem I encounter is that this implementation blocks me from swipping horizontally at all, so the VerticalViewPager consumes my horizontal MOVE action and nothing happens. After I release from horizontal dragging a action DOWN is triggered.

Any suggestions on this? I think the problem could be in my touch event handling in the VerticalViewPager class.

Stefan Sprenger
  • 1,050
  • 20
  • 42

0 Answers0