2016-01-05 10 views
5

Ich implementiere einen ViewPager, der die nächsten und vorherigen Elemente anzeigt und auch Seitenübergänge mit ViewPager.PageTransformer animiert. Es hat einen Zoom-Out- und einen Fade-Out-Effekt. Zum Anzeigen der nächsten und vorherigen Seite verwende ich Negative PageMargin, padding auf viewpager und clipToPadding als false. Dies ist, wie es wieCentered View Pager mit der nächsten und vorherigen Vorschau und Pagetransformer

enter image description here

sieht Welche ist das, was ich will. Das Problem besteht darin, dass PageTransform die linke Kante als Referenz verwendet, d. H. Es zeigt den maximalen Zoom, wenn das Bild die linke Kante berührt, und nicht, wenn es sich in der Mitte befindet. Um dies zu beheben, habe ich eine in der Code-Offset wie folgt

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

ich den Positionswert protokolliert, wenn Bild in der Mitte und fand den Offset. Dieser Offset funktioniert jedoch nur auf xxhdpi-Geräten. Auf xxxhdpi ergibt sich der Wert 0.12068965f. Außerdem ändert sich der Offset, wenn ich die Auffüllung von ViewPager ändere. Auch die Vorschaugröße der nächsten und vorherigen Änderungen mit dpi.

Frage

Wie kann ich die Polsterung, Marge zu berechnen und insbesondere Offset konsistentes Verhalten in verschiedenen Pulverinhalatoren zu halten?

-Code

Hier ist mein Layout, wo ich das Hinzufügen bin viewpager und seine Polsterung

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

Hier wird die viewpager Initialisierung Code:

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

Sie eine Lösung für dieses – Pallavi

+0

@Pallavi ja bekommen hat. Es ist Monate her und ich habe mir keinen Kommentar hinterlassen. Also, während ich mich nicht erinnern kann, wie, fand ich den Offset zu paddingLeft/page.getMeasuredWidth() '. Den vollständigen Code des Transformators als Antwort eingeben. – gitter

+0

Danke für den Code ..! – Pallavi

Antwort

2

Dies ist, was ich am Ende mit:

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

und ich stellte es als

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

Ich habe gerade Ihre Lösung versucht, aber wenn ich den 'ZoomFadeTransformer' benutze, kann ich die Vorschau der nächsten und vorherigen Seite nicht mehr sehen. Hatten Sie das gleiche Problem? – Katharina

+0

@Gitter hast du es geschafft, die Vorschau der vorherigen und nächsten Seiten zu behalten? – Raykud