次と前のアイテムを表示し、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);