Я читал пример настройки ViewPager
анимации скользящей страницы, которая влечет за собой перевод страницы (View
) на определенную сумму. Пример из docs. В частности, речь идет о реализации под названием ZoomOutPageTransformer
, которая может быть установлена на ViewPager
через setPageTransformer()
для настройки слайдов страницы (включая анимацию масштабирования).
Вот как должен выглядеть конечный результат:
Теперь они описывают, как они это сделают:
В вашей реализации
transformPage()
вы можете создать пользовательские слайд-анимации, определяя, какие страницы должны быть преобразуется в зависимости от положения страницы на экране, полученной из параметраposition
методаtransformPage()
.Параметр
position
указывает, где находится данная страница относительно центра экрана. Это динамическое свойство, которое изменяется, когда пользователь прокручивает страницы. Когда страница заполняет экран, его значениеposition
равно 0. Когда страница рисуется в непосредственной близости от правой части экрана, значениеposition
равно 1. Если пользователь прокручивает на полпути между страницами один и два, страница 1 имеетposition
от -0.5 и страница 2 имеет значениеposition
0,5. На основеposition
страниц на на экране вы можете создавать собственные анимации слайдов, задавая страницу свойства с такими методами, какsetAlpha()
,setTranslationX()
илиsetScaleY()
.
И это реализация PageTransformer
, которую они предоставили:
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
if (position < 0) {
view.setTranslationX(horzMargin - vertMargin / 2);
} else {
view.setTranslationX(-horzMargin + vertMargin / 2);
}
// Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
// Fade the page relative to its size.
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
Проблема:
Я не могу понять утверждение,
view.setTranslationX(horzMargin - vertMargin / 2);
Мое понимание заключалось в том, что значение 1.0 для параметра position
соответствует покрытию ширины экрана, т.е. w. Итак, если центр страницы переместил х единиц position
, тогда перевод в терминах пикселей /dp был бы, w * x. Но они используют вычисление маржи для расчета суммы перевода.
Может кто-нибудь объяснить, как они это сделали, и что было бы неправильно с моими расчетами?