26

Eine App, die ich entwickle, zeigt ein Raster mit Bildern an. Wenn Sie auf ein Bild tippen, wird die Detailansicht angezeigt. Die Detailansicht enthält einen ViewPager, mit dem Sie zwischen allen Bildern im Raster wischen können. Dies geschieht durch Übergeben einer Liste von Pfaden (die jedes Bild im Raster enthalten), zusammen mit einem Offset des Bildes, das angetippt wurde, so dass der ViewPager so eingestellt werden kann, dass er diese Seite anfänglich anzeigt.ViewPager-Fragmente - Gemeinsame Elementübergänge

Was ist der beste Weg, um einen geteilten Element Übergang in das Fragment der aktuellen Offset-Seite im ViewPager zu haben? Das Rasterbild (RecyclerView) sollte auf der aktuellen Seite in das Vollbild erweitert werden. Ich sah die Möglichkeit, Aktivitätsübergänge zu verschieben und wieder aufzunehmen, so dass die App warten würde, bis das Bild von der Festplatte geladen wurde. Aber ich möchte in der Lage sein, es auf die richtige Seite im View-Pager animieren zu lassen und auch zu der aktuellen Seite zurückzukehren, wenn der Benutzer zurückgeht (da Sie zwischen den Seiten wischen können). Wenn Sie jetzt zu einer anderen Seite wischen, wird die ursprüngliche Seite in das Raster animiert.

Momentan weise ich jedem Bild in den Fragmenten des Viewpagers einen transitionName im Format "image_ [index]" zu. Wenn ich die Detailaktivität starte, verwende ich den gleichen transitionName, wobei der Index der Offset ist.

In diesem Zusammenhang fragte ich mich auch, wie man Wellen mit langen Pressen arbeiten lassen kann. Wenn Sie den aktivierten Zustand einer Ansicht ändern, scheint sie die Welligkeit aufzuheben. Ich möchte einen ähnlichen Effekt wie Google Mail, bei dem die Welligkeit von vorne beginnt und nach einem langen Druck schnell endet und den aktivierten Status auslöst.

+0

Sie könnten Ihre zweite Frage über die Welle in einem separaten Post stellen. Außerdem kann ich morgen noch eine ausführlichere Antwort auf Ihre Frage über den View Pager und die geteilten Elemente geben, wenn ich mehr Zeit habe, aber jetzt können Sie [dieses Beispielprojekt] (https://github.com/alexjlockwood/activity -Übergänge). Ich habe es vor ein paar Wochen geschrieben und es klingt, als ob es fast genau das ist, was du beschreibst. : P –

+0

@AlexLockwood guter Punkt. Und wow, du hast Recht, ich habe es einfach ausgeführt und es ist ziemlich genau das, was ich brauche; Ich werde es in den nächsten Tagen anschauen müssen, danke! – afollestad

+0

Hallo, das funktioniert nicht für mich .. was ich versuche, ist, dass ich eine Liste in einem Fragment des Viewpager habe und auf ein beliebiges Element klicke, um das Bild in sein Detailfragment zu übertragen. Ich habe jede mögliche Lösung ausprobiert ..aber nichts funktioniert .. jede Hilfe wird geschätzt. Vielen Dank im Voraus. - –

Antwort

34

Von dem, was ich sagen kann (und korrigieren Sie mich, wenn ich falsch liege), was Sie versuchen zu erreichen ist im Grunde so etwas wie folgt: Angenommen, Sie haben eine MainActivity, eine DetailsActivity, und eine willkürliche Reihe von Bildern. Die MainActivity zeigt die Menge der Bilder in einem Raster an und die DetailsActivity zeigt den gleichen Satz Bilder in einer horizontalen ViewPager an. Wenn der Benutzer ein Bild in MainActivity auswählt, sollte das Bild von seiner Position im Raster auf die richtige Seite in der zweiten Aktivität ViewPager wechseln.

Das Problem, das wir lösen möchten, ist "Was ist, wenn der Benutzer Seiten innerhalb der DetailsActivity wechselt"? In diesem Fall möchten wir das freigegebene Bild ändern, das während des Rückkehr-Übergangs verwendet wird. Standardmäßig verwendet das Aktivitätsübergangs-Framework das freigegebene Element, das während der Eingabeübergabe verwendet wurde ... aber die Seite des Ansichtspagers hat sich so geändert, dass wir dieses Verhalten irgendwie überschreiben möchten.Um dies zu tun, müssen wir ein SharedElementCallback in Ihren MainActivity und DetailsActivity ‚s onCreate() Methoden setzen und überschreiben die onMapSharedElements() Methode wie folgt:

private final SharedElementCallback mCallback = new SharedElementCallback() { 
    @Override 
    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
     if (mCurrentImagePosition != mOriginalImagePosition) { 
      View sharedView = getImageAtPosition(mCurrentImagePosition); 
      names.clear(); 
      sharedElements.clear(); 
      names.add(sharedView.getTransitionName()); 
      sharedElements.put(sharedView.getTransitionName(), sharedView); 
     } 
    } 

    /** 
    * Returns the image of interest to be used as the entering/returning 
    * shared element during the activity transition. 
    */ 
    private View getImageAtPosition(int position) { 
     // ... 
    } 
}; 

Für eine vollständigere Lösung, ich habe ein sample project on GitHub geschaffen, erreichen werden diese Effekt (es gibt zu viel Code, um in einer einzelnen StackOverflow-Antwort zu posten).

+0

Das ist perfekt, vielen Dank für Ihre Hilfe! – afollestad

+0

Hallo, das funktioniert nicht für mich .. was ich versuche ist, dass ich eine Liste in einem Fragment des Viewpager habe und auf ein beliebiges Element klicke, um das Bild zu seinem Detailfragment zu übertragen. Ich habe jede mögliche Lösung ausprobiert, die ich hier bekommen habe ..aber nichts funktioniert .. jede Hilfe wird geschätzt. Vielen Dank im Voraus. - –

+0

Danke, sehr nützlich! – schwertfisch

3

Ich nehme an, dass Sie Fragmentübergänge verwenden und dass Sie nicht zwischen Aktivitäten animieren. Dies ist sowohl bei Aktivitätsübergängen als auch bei Fragmentübergängen möglich, der spezifische Code ist jedoch etwas anders. Die Verschiebung ist jedoch nicht für Fragmentübergänge verfügbar.

Das addSharedElement verwendet einen zweiten Parameter. Wenn Sie den spezifischen Namen im Zielfragment beim Aufruf kennen, können Sie einfach den Namen im zu verwendenden Detailfragment auswählen. Wenn Sie dies nicht tun, können Sie einen beliebigen Namen auswählen und ihn mit dem für das Fragment festgelegten SharedElementCallback neu zuordnen.

Wenn es auf dem Rückweg nicht übereinstimmt, wird der gleiche Anruf gemacht, um es neu zu ordnen. Dies ist wahrscheinlich sowohl im aufrufenden Fragment als auch im aufgerufenen Fragment der Fall - im aufrufenden Fragment verwenden Sie setExitSharedElementCallback. Ich erwarte, dass dies in Ihrer App der Fall ist.

Ebenso legen Sie in Aktivitätsübergängen denselben SharedElementCallback fest und verwenden dieselbe Zuordnung, aber Sie tun dies stattdessen für die Aktivität.

+0

Dies ist definitiv Fortschritt in Richtung was ich tun möchte, das Problem ist, dass es zwei Aktivitäten gibt. Eins zeigt Fragmente an, die Raster von Bildern enthalten. Die andere enthält einen ViewPager, in dem die Detailfragmente enthalten sind. – afollestad

+0

Sie verwenden Aktivitätsübergänge und es kommt vor, dass Ihre Ansichten in Fragmenten vorliegen. Sie müssen entweder die Eingabeübergabe verschieben oder die ausstehende Fragmenttransaktion in onCreate ausführen. Welche Probleme siehst du jetzt? –