2016-01-05 17 views
5

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

enter image description here

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); 
+0

hai preso alcuna soluzione per questo – Pallavi

+0

@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

+0

Grazie per il codice ..! – Pallavi

risposta

2

Questo è quello che ho finito con:

public class ZoomFadeTransformer implements ViewPager.PageTransformer { 

    private float offset = -1; 
    private float paddingLeft; 
    private float minScale; 
    private float minAlpha; 

    public ZoomFadeTransformer(float paddingLeft, float minScale, float minAlpha) { 
     this.paddingLeft = paddingLeft; 
     this.minAlpha = minAlpha; 
     this.minScale = minScale; 
    } 

    @Override 
    public void transformPage(View page, float position) { 
     if (offset == -1) { 
      offset = paddingLeft/page.getMeasuredWidth(); 
     } 
     if (position < -1) { 
      page.setAlpha(0); 
     } else if (position <= 1) { 
      float scaleFactor = Math.max(minScale, 1 - Math.abs(position - offset)); 
      page.setScaleX(scaleFactor); 
      page.setScaleY(scaleFactor); 
      float alphaFactor = Math.max(minAlpha, 1 - Math.abs(position - offset)); 
      page.setAlpha(alphaFactor); 
     } else { 
      page.setAlpha(0); 
     } 
    } 
} 

e ho impostato come

viewPager.setPageTransformer(false, new ZoomFadeTransformer(viewPager.getPaddingLeft(), MIN_SCALE, MIN_ALPHA)); 
+1

Ho appena provato la tua soluzione, ma se sto usando 'ZoomFadeTransformer' non riesco più a vedere l'anteprima della pagina successiva e precedente. Hai affrontato lo stesso problema? – Katharina

+0

@gitter sei riuscito a mantenere l'anteprima delle pagine precedenti e successive? – Raykud

Problemi correlati