This is quite old, but wish it's not too late for somebody
Step 1:
Create custom ViewPager
which extends from ViewPager
.
Step 2:
Determine which Fragment
positions (ViewPager
page integers) you need to have a unique PageTransformer
for them. Then add these indices into a list within the custom ViewPager
.
Step 3:
Override onPageScrolled(int position, float offset, int offsetPixels)
:
- Check if the
position
is in your list of indices, if so, then you have to create a Custom PageTransformer
object; and then utilize the ViewPager
setPageTransformer()
to change the page transformation.
- For positions other than that, then you've to set the default
PageTransformer
(or you can also you another custom PageTransformer
object if you wish.
Code
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
PageTransformer mDepthPageTransformer = new PageTransformer() {
private static final float MIN_SCALE = 0.75f;
public void transformPage(@NonNull View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0f);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1f);
view.setTranslationX(0f);
view.setScaleX(1f);
view.setScaleY(1f);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0f);
}
}
};
PageTransformer mDefaultPageTransformer = new PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
}
};
@Override
protected void onPageScrolled(int position, float offset, int offsetPixels) {
List<Integer> pos = new ArrayList<>();
pos.add(0);
pos.add(n - 1); // n is the no. of pages as in the question
if (pos.contains(position)) {
this.setPageTransformer(true, mDepthPageTransformer);
} else {
this.setPageTransformer(true, mDefaultPageTransformer);
}
super.onPageScrolled(position, offset, offsetPixels);
}
}
Documentation
Note: mDepthPageTransformer used in my example is taken from the above mentioned documentation.