7

次と前のアイテムを表示し、ViewPager.PageTransformer を使用してページ遷移をアニメーション化する ViewPager を実装しています。ズームアウトとフェードアウトの効果があります。次と前を表示するために、負の PageMargin、ビューページャーのパディング、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で変化します。

質問

パディング、マージン、特にオフセットを計算して、異なる dpi 間で一貫した動作を維持するにはどうすればよいですか?

コード

ビューページャーとそのパディングを追加するレイアウトは次のとおりです

<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>

ビューページャーの初期化コードは次のとおりです。

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);
4

1 に答える 1