2015-02-07 6 views
13

Lassen Sie uns sagen, ich bin ein ansichtsbasierte Ansatz Beispiel ein Android-Anwendung zu entwickeln, wie in dem folgenden Artikel beschrieben: http://corner.squareup.com/2014/10/advocating-against-android-fragments.htmlGeteilt Element von Übergängen zwischen Ansichten (nicht Aktivitäten oder Fragmente)

ich zwei volle So, jetzt haben Bildschirmansichten. Eins ist sichtbar und enthält ein Raster von Bildern. Der andere ist versteckt und ist eine Detailansicht des zu klickenden Bildes. Ohne Übergänge beim Klicken auf ein Bild im Raster wird die Rasteransicht ausgeblendet und die Detailansicht angezeigt. Was nun, wenn ich etwas haben möchte, das einem geteilten Element-Übergang zwischen dem kleinen Bild in der Rasteransicht und dem größeren Bild in der Detailansicht ähnelt. Ist so etwas möglich?

Image

+2

android.transition.Scene? – pskink

Antwort

18

Ja, ermöglichen Übergänge dies.

In Ihrem Beispiel befinden sich die Raster- und Detailansichten bereits in Ihrer Hierarchie. Um Übergänge zu verwenden, funktioniert es besser, wenn die Detailansicht nicht in der Ansichtshierarchie beginnt. Sie müssen die zwei Ansichten austauschen.

Es gibt zwei (ähnliche) Möglichkeiten, dies zu tun. Die erste besteht darin, die Rasteransicht in einer Szene zu haben. Dann benutze TransitionManager.go (DetailScene, Übergang).

Die zweite Möglichkeit besteht darin, TransitionManager.beginDelayedTransition zu verwenden und dann das detaillierte Layout für das Rasterlayout zu vertauschen.

Es ist wichtig, dass die gemeinsamen Ansichten etwas gemeinsam haben. Normalerweise ist dies eine View ID oder transitionName. Diese Verknüpfung teilt dem Übergangssystem mit, dass die Ansichten unterschiedliche Instanzen sind.

Der Übergang, den Sie verwenden möchten, ist @android: Übergang/Verschieben. Es kombiniert ChangBounds, ChangeTransform, ChangeImageTransform und ChangeClipBounds. Sie müssen dies in den Ansichten des freigegebenen Elements anvisieren. Es sieht so aus, als ob Sie für die ein- und/oder ausgehenden Ansichten einen weiteren Übergang (Fade?) Benötigen.

Etwas wie folgt aus:

TransitionSet shared = ... 
shared.addTarget("sharedName"); 
gridElement.setTransitionName("sharedName"); 
Fade fade = new Fade(); 
fade.excludeTarget("sharedName", true); 
TransitionSet set = new TransitionSet(); 
set.addTransition(shared) 
    .addTransition(fade); 
TransitionManager.go(detailScene, set); 
+1

George, vielen Dank für Ihre Antwort! Ich habe eine schnelle POC mit Ihrem Ansatz erstellt (https://github.com/eugenkiss/MaterialEverywhere/commit/53b6ddcd22f40e06b11a06b9c7613a1e8b13ffe5). Wenn Sie jedoch den viewbasierten (gemeinsamen) Übergang mit dem ursprünglichen aktivitätsbasierten Übergang vergleichen, werden Sie einige Mängel feststellen. Z. B. wird das geteilte Element nicht auf dem Overlay gezeichnet, sondern die vorherige Szene ist. Sehen Sie eine Möglichkeit, diesen Ansatz so zu verbessern, dass er (fast) genau wie der vorherige aktivitätsbasierte Übergang aussieht? – Eugen

+1

Ich habe gute Nachrichten und schlechte Neuigkeiten. Die gute Nachricht ist, dass ich herausgefunden habe, wie Sie Ihre App-Übergänge zum Laufen bringen können. Die schlechte Nachricht ist, dass es ein wenig hokey ist! Sowohl der Überblendungsübergang als auch die ChangeTransform fügen dem Overlay Ansichten hinzu. Ich glaube nicht, dass es eine Garantie für die Reihenfolge dieser Ergänzungen gibt. Es funktioniert nur, wenn Sie das Hinzufügen zu dem Set invertieren (zuerst blenden, dann gemeinsam). Der transitionName wurde auch auf das falsche Element (den Container des imageViews) angewendet, sodass ChangeImageTransform nicht darauf angewendet werden konnte. –

+0

Danke, es funktioniert (https://github.com/eugenkiss/MaterialEverywhere/commit/6599d6d42463710eb8422435ea7ef306360cf598)! – Eugen

Verwandte Themen