You have to keep visible not only the selected item but also the one that was selected before this if you want the slide animate from one to the other. After you call setCurrentItem(selectedItem,true)
, all calls to viewPager.getCurrentItem()
inside transformPage
returns the same value you set before, it's not that it changes through smooth scroll. I think you can do it this way with transformPage:
int prevSelFrag = 0, currentSelFrag = 0; //member variables
@Override
protected void onCreate(Bundle savedInstanceState) {
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
prevSelFrag = currentSelFrag;
currentSelFrag = pos;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
pager.setPageTransformer(false, new PageTransformer() {
@Override
public void transformPage(View page, float relativePosition) {
float transDiff = prevSelFrag - currentSelFrag;
if (transDiff > 1.0f || transDiff < -1.0f) {
boolean transIsToRight = transDiff < 0.0f;
if (transIsToRight && relativePosition < -1) {
page.setVisibility(View.GONE);
} else if (relativePosition > 1) { //trans is to left
page.setVisibility(View.GONE);
}else{
page.setVisibility(View.VISIBLE);
}
}else{
page.setVisibility(View.VISIBLE);
}
}
});
}
relativePosition is the page position relative to the page set on setCurrentItem, so that the given View page
has to go to that position in the animation (but not in real pager state). If for example you are on page 0 and call setCurrentItem(2,true)
in transformPage you may receive:
- current view in page 1 with relativePosition=-2
- current view in page 0 with relativePosition=-1
- current view in page 2 with relativePosition=0
Of course these values vary between them to do the transition effect.
ViewPager smoothScroll didn't work for me, had to use this solution to fix that -> https://stackoverflow.com/a/14776244/4282954