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.