final int paddingPx = 300;
final float MIN_SCALE = 0.8f;
final float MAX_SCALE = 1f;
viewPager.setClipToPadding(false);
viewPager.setPadding(paddingPx, 0, paddingPx, 0);
viewPager.setPageTransformer(false, transformer);
Это делает страницы меньше ширины окна просмотра:
Вот мой Трансформер:
PageTransformer transformer = new PageTransformer() {
@Override
public void transformPage(View page, float position) {
float pagerWidthPx = ((ViewPager) page.getParent()).getWidth();
float pageWidthPx = pagerWidthPx - 2 * paddingPx;
float maxVisiblePages = pagerWidthPx / pageWidthPx;
float center = maxVisiblePages / 2f;
float scale;
if (position + 0.5f < center - 0.5f || position > center) {
scale = MIN_SCALE;
} else {
float coef;
if (position + 0.5f < center) {
coef = (position + 1 - center) / 0.5f;
} else {
coef = (center - position) / 0.5f;
}
scale = coef * (MAX_SCALE - MIN_SCALE) + MIN_SCALE;
}
page.setScaleX(scale);
page.setScaleY(scale);
}
};
Сложность в этом заключается в position
параметре метода transformPage
. Когда страницы заполняются по ширине окна просмотра, этот параметр изменяется с 0 на 1. Но когда страницы меньше, этот параметр хитрый.
position
- значение левой стороны вида. Ширина страницы равна 1. position
равно 0, когда левая сторона страниц находится на левой стороне окна просмотра. Так что position
может быть больше 1, зависит от ширины страницы.
Сначала вам нужно найти центр виджетов (относительно параметра position
). Затем уменьшите страницу, если страница перемещается влево или вправо от центра. В моей реализации я уменьшаю вид на половину страницы от центра.
Вот результат:
Ширина страницы может контролироваться с помощью padding
.
Дополнительное поле между страницами может быть добавлено методом viewPager.setPageMargin(value)
.