android — Пейджер с центрированным представлением со следующим и предыдущим предварительным просмотром и преобразователем страниц" />

Пейджер с центрированным представлением со следующим и предыдущим предварительным просмотром и преобразователем страниц

Я реализую ViewPager, который показывает следующий и предыдущий элементы, а также анимирует переходы страниц с помощью ViewPager.PageTransformer. Имеет эффект уменьшения и уменьшения. Для отображения следующего и предыдущего я использую PageMargin с отрицательным значением, отступ для viewpager и clipToPadding как false. Вот как это выглядит

 введите описание изображения здесь

Что я и хочу. Проблема заключается в том, что PageTransform использует левый край в качестве эталона, т. Е. Он показывает максимальное увеличение, когда изображение касается левого края, а не когда оно находится в центре. Чтобы исправить это, я использовал смещение в коде следующим образом

viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
        @Override
        public void transformPage(View page, float position) {
            if (position < -1) {
                page.setAlpha(0);
            } else if (position <= 1) {
                float scaleFactor = Math.max(0.7f, 1 - Math.abs(position - 0.14285715f));
                page.setScaleX(scaleFactor);
                page.setScaleY(scaleFactor);
                page.setAlpha(scaleFactor);
            } else {
                page.setAlpha(0);
            }
        }
    });

Я зарегистрировал значение положения, когда изображение находится в центре, и нашел смещение. Но это смещение работает только на устройствах xxhdpi. На xxxhdpi значение получается равным 0,12068965f. Кроме того, смещение изменяется, когда я меняю отступ в ViewPager. Кроме того, размер предварительного просмотра следующих и предыдущих изменений с dpi.

Вопрос

Как я могу рассчитать отступы, поля и особенно смещение, чтобы сохранить согласованное поведение для разных dpis?

код

Вот мой макет, куда я добавляю viewpager и его отступы

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:clipToPadding="false"
        android:paddingLeft="40dp"
        android:paddingRight="40dp">

    </android.support.v4.view.ViewPager>

    <Button
        android:id="@+id/swiper"
        android:text="Animate"
        android:layout_centerInParent="true"
        android:layout_below="@id/viewPager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Вот код инициализации viewpager:

final ViewPager viewPager = ((ViewPager) findViewById(R.id.viewPager));
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, r.getDisplayMetrics());
viewPager.setPageMargin((int) (-1 * px));
viewPager.setOffscreenPageLimit(5);
7 голосов | спросил gitter 5 Jam1000000amTue, 05 Jan 2016 09:43:33 +030016 2016, 09:43:33

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132