Sto implementando un ViewPager che mostra elementi successivi e precedenti e anima anche le transizioni di pagina utilizzando ViewPager.PageTransformer. Ha un effetto di riduzione e dissolvenza. Per mostrare il prossimo e il precedente, sto usando PageMargin negativo, riempito su viewpager e clipToPadding come falso. Questo è come sembraPager con visualizzazione centrata con anteprima e pagetransformer precedente e successivo
Che è quello che voglio. Il problema è che PageTransform usa il bordo sinistro come riferimento, cioè mostra lo zoom massimo quando l'immagine tocca il bordo sinistro anziché quando è al centro. Per risolvere questo problema, ho utilizzato un offset nel codice come segue
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);
}
}
});
mi sono collegato al valore di posizione quando l'immagine si trova nel centro e ho trovato l'offset. Ma questo offset funziona solo su dispositivi xxhdpi. Su xxxhdpi, il valore risulta essere 0.12068965f. Inoltre, l'offset cambia quando cambio il padding su ViewPager. Inoltre, la dimensione dell'anteprima delle modifiche successive e precedenti con dpi.
Domanda
Come posso calcolare il padding, margini e in particolare di offset per mantenere un comportamento coerente in diversi DPI?
Codice
Ecco il mio layout in cui sto aggiungendo viewpager e la sua imbottitura
<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>
ecco il codice viewpager inizializzazione:
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);
hai preso alcuna soluzione per questo – Pallavi
@Pallavi sì. Sono passati mesi e non mi sono lasciato un commento. Quindi, mentre non ricordo come, ho trovato l'offset come 'paddingLeft/page.getMeasuredWidth()'. Pubblicare il codice completo del trasformatore come risposta. – gitter
Grazie per il codice ..! – Pallavi