Android ViewPager ZoomOut анимация - PullRequest
0 голосов
/ 20 мая 2019

У меня есть ViewPager, который выглядит следующим образом:

enter image description here

Мне нужны предварительные просмотры по бокам для ZoomOut, когда вы проводите и сохраняете только размервида в центре, что-то вроде этого:

enter image description here

Я уже пробовал некоторые примеры с ViewPager.PageTransformer(), но эти примеры всегда с анимацией затухания (ЭтоМне не нужно) и не показывает предварительный просмотр (который мне нужен).

1 Ответ

0 голосов
/ 23 мая 2019
    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);

Это делает страницы меньше ширины окна просмотра:

enter image description here

Вот мой Трансформер:

    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, зависит от ширины страницы. enter image description here

Сначала вам нужно найти центр виджетов (относительно параметра position). Затем уменьшите страницу, если страница перемещается влево или вправо от центра. В моей реализации я уменьшаю вид на половину страницы от центра.

Вот результат:

enter image description here enter image description here

Ширина страницы может контролироваться с помощью padding.

Дополнительное поле между страницами может быть добавлено методом viewPager.setPageMargin(value).

...