2017-07-30 6 views
0

Zeichnung Ich habe folgende ViewPager:Umgekehrte Reihenfolge in der Hälfte von ViewPager

Screenshot

Ich versuche, eine Cover-Flow-Ansicht zu bauen. Das bedeutet, dass sich die Position und die Größe der Ansichten in ViewPager je nach Berührungseingabe ändern.

Alles funktioniert gut mit meiner Implementierung mit Ausnahme der Zeichnungsreihenfolge der Ansichten.

Ich kann entweder pager.setPageTransformer(false,PageTransformer()) anrufen, die wie im Bild oben aussieht, oder setPageTransformer(true, PageTransformer()), die die Zeichnungsreihenfolge umkehren würde.

Das Problem ist, dass ich die mittlere Ansicht (grün) vor seinen Nachbarn (blau, grau) brauche.

Ich habe ein paar Beiträge über view.bringToFront() gelesen, aber ich konnte keine Lösung mit diesem Ansatz finden. Eine Middle-View-to-Front-Lösung wäre cool, aber das funktioniert nur, wenn drei Ansichten gleichzeitig sichtbar sind. Bei fünf Ansichten würde sich die fünfte Ansicht immer noch mit der vierten Ansicht überschneiden. (verwirrend, nicht wahr? ^^)

Übrigens ist meine minSdk 16 zu 18, also ist Elevation (Lollipop) nicht möglich.

Hier ist meine aktuelle PageTransformer

class PageTransformer() : ViewPager.PageTransformer { 
    val MIN_SCALE = 0.75f 

    override fun transformPage(view: View, position: Float) { 
     val pageWidth = view.width 
     val pageHeight = view.height 
     var vertMargin = pageHeight * (1 - MIN_SCALE)/2 
     var horzMargin = pageWidth * (1 - MIN_SCALE)/2 
     view.scaleX = MIN_SCALE 
     view.scaleY = MIN_SCALE 
     if (position < -2) { // [-Infinity,-1) 
      // This page is way off-screen to the left. 
      view.translationX = horzMargin - vertMargin/2 
     } else if (position <= 2) { // [-1,1] 
      // Modify the default slide transition to shrink the page as well 
      val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)) 
      vertMargin = pageHeight * (1 - scaleFactor)/2 
      horzMargin = pageWidth * (1 - scaleFactor)/2 
      if (position < 0) { 
       view.translationX = horzMargin - vertMargin/2 
      } else { 
       view.translationX = -horzMargin + vertMargin/2 
      } 
      // Scale the page down (between MIN_SCALE and 1) 
      view.scaleX = scaleFactor 
      view.scaleY = scaleFactor 
      view.rotationY = position * -30 
     } else { // (1,+Infinity] 
      // This page is way off-screen to the right. 
      view.translationX = -horzMargin + vertMargin/2 
     } 
    } 
} 

diese zusammenfassend, ich ViewPager müssen, die ihre Zeichnung, um nach dem aktuellen Artikel umkehrt.

Hinweis: Ich habe bereits jede verfügbare Bibliothek ausprobiert, aber nichts hat funktioniert.

Ich hoffe, es ist ein Genie, der mir helfen kann :)

+0

Können Sie eine Bleistiftskizze von, was Ihre Notwendigkeit? Ich verstehe es nicht ganz – Mani

+0

die graue Ansicht überschneidet sich mit der grünen einen Biegezeichnung Reihenfolge ist von links nach rechts. Ich möchte eine Bestellung von Mitte zu Seite. – Appyx

+0

Hey, hast du irgendeine Lösung gefunden? –

Antwort

0

Sie die getChildDrawingOrder der viewpager Klasse überschreiben können: Wie so

@Override 
protected int getChildDrawingOrder (int childCount, int i) { 
    int j = getCurrentItem(); 
    if (i == j) { 
     return childCount - 1; 
    } 

    if (i == childCount - 1) { 
     return j; 
    } 

    if (j == 0) { 
     if (i == 1) { 
      i = 2; 
     } else if (i == 2) { 
      i = 1; 
     } 
    } 

    return super.getChildDrawingOrder (childCount, i); 
} 
+0

das funktioniert nicht während der Animation des Viewpagers ... – Appyx

Verwandte Themen