Mit einem benutzerdefinierten Übergang können Sie eine Animation erstellen, die in keiner der die integrierten Übergangsklassen. Sie können z. B. einen benutzerdefinierten Übergang definieren, Vordergrundfarbe von Text- und Eingabefeldern auf grau, um anzuzeigen, dass die Felder deaktiviert sind auf dem neuen Bildschirm. Durch diese Art der Änderung können Nutzer die von Ihnen deaktivierten Felder sehen.
Ein benutzerdefinierter Übergang, wie einer der integrierten Übergangstypen, wendet Animationen auf Kinderansichten der Start- und Endszene Im Gegensatz zu den integrierten Übergangstypen müssen Sie den Code bereitstellen, mit dem Property-Werte erfasst und Animationen generiert werden. Sie können auch eine Teilmenge der Zielansichten für die Animation definieren.
Auf dieser Seite erfahren Sie, wie Sie Property-Werte erfassen und Animationen generieren können, benutzerdefinierte Übergänge.
Transition-Klasse erweitern
Wenn Sie einen benutzerdefinierten Übergang erstellen möchten, fügen Sie Ihrem Projekt eine Klasse hinzu, die die Transition
-Klasse erweitert, und überschreiben Sie die im folgenden Snippet gezeigten Funktionen:
Kotlin
class CustomTransition : Transition() { override fun captureStartValues(transitionValues: TransitionValues) {} override fun captureEndValues(transitionValues: TransitionValues) {} override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? {} }
Java
public class CustomTransition extends Transition { @Override public void captureStartValues(TransitionValues values) {} @Override public void captureEndValues(TransitionValues values) {} @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {} }
In den folgenden Abschnitten wird erläutert, wie Sie diese Funktionen überschreiben.
Property-Werte der Ansicht erfassen
Für Übergangsanimationen wird das Eigenschaftsanimationssystem verwendet, das unter Property-Animation Unterkunft Animationen eine Ansichtseigenschaft von einem Startwert in einen Endwert für einen angegebenen Wert Zeitraum, daher muss das Framework sowohl den Start- als auch den Endwert eines zum Erstellen der Animation.
Für eine Eigenschaftsanimation ist jedoch normalerweise nur eine kleine Teilmenge aller Property-Eigenschaften der Ansicht erforderlich. Werte. Eine Farbanimation benötigt Farbeigenschaftswerte, während eine Bewegung für die Animation sind Eigenschaftswerte für Positionen erforderlich. Da die für eine Animation erforderlichen Property-Werte spezifisch für einen Übergang sind, stellt das Übergangsframework nicht jeden Attributwert bereit. zu einem Übergang zu führen. Stattdessen ruft das Framework Callback-Funktionen auf, die einen Übergang zu nur die benötigten Eigenschaftswerte erfassen und im Framework speichern.
Startwerte erfassen
Implementieren Sie die Methode
captureStartValues(transitionValues)
. Das Framework ruft diese Funktion für jede Ansicht in der Startszene auf. Die Funktion
Argument ist ein TransitionValues
-Objekt, das einen Verweis enthält.
und einer Map
-Instanz, in der Sie die Ansichtswerte speichern können,
Rufen Sie in Ihrer Implementierung diese Eigenschaftswerte ab und übergeben Sie sie an die
Framework, indem sie in der Karte gespeichert werden.
Um sicherzustellen, dass der Schlüssel für einen Eigenschaftswert nicht mit anderen
TransitionValues
-Schlüssel verwenden das folgende Namensschema:
package_name:transition_name:property_name
Das folgende Snippet zeigt eine Implementierung der captureStartValues()
-Funktion:
Kotlin
class CustomTransition : Transition() { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background" override fun captureStartValues(transitionValues: TransitionValues) { // Call the convenience method captureValues captureValues(transitionValues) } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private fun captureValues(transitionValues: TransitionValues) { // Get a reference to the view val view = transitionValues.view // Store its background property in the values map transitionValues.values[PROPNAME_BACKGROUND] = view.background } ... }
Java
public class CustomTransition extends Transition { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private static final String PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"; @Override public void captureStartValues(TransitionValues transitionValues) { // Call the convenience method captureValues captureValues(transitionValues); } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private void captureValues(TransitionValues transitionValues) { // Get a reference to the view View view = transitionValues.view; // Store its background property in the values map transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground()); } ... }
Endwerte erfassen
Das Framework ruft die Funktion captureEndValues(TransitionValues)
auf.
einmal für jede Zielansicht in der Schlussszene. Ansonsten funktioniert captureEndValues()
genauso wie captureStartValues()
.
Das folgende Code-Snippet zeigt eine Implementierung der Funktion captureEndValues()
:
Kotlin
override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) }
Java
@Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); }
In diesem Beispiel sind sowohl der captureStartValues()
als auch der captureEndValues()
-Funktionen rufen captureValues()
auf, um Werte abzurufen und zu speichern. Ansichtseigenschaft
die von captureValues()
abgerufen werden, ist gleich, hat aber unterschiedliche Werte im
die Start- und Endszene. Das Framework verwaltet separate Karten für den
Status einer Ansicht.
Benutzerdefinierten Animationsfilm erstellen
Um die Änderungen an einer Ansicht zwischen ihrem Zustand in der Startszene und ihrem Zustand in
der Endszene einen Animator durch Überschreiben des
createAnimator()
. Wenn das Framework diese Funktion aufruft, wird sie in der Szenenstammansicht und dem
TransitionValues
-Objekte, die die Start- und Endwerte enthalten
die Sie aufgenommen haben.
Wie oft das Framework die Funktion createAnimator()
aufruft, hängt vom
zwischen der Start- und Endszene.
Stellen Sie sich zum Beispiel eine Ausblendung oder
Einblendungsanimation, die als benutzerdefinierter Übergang implementiert wurde. Hat die Ausgangsszene fünf Ziele,
welche zwei aus der Schlussszene entfernt werden, und die letzte Szene enthält die drei Ziele aus der
Startszene und ein neues Ziel, dann ruft das Framework createAnimator()
sechsmal auf.
Bei drei Anrufen werden das Ein- und Ausblenden der Ziele animiert, die in beiden Szenen bleiben.
Objekte. Bei zwei weiteren Aufrufen wird das Ausblenden der Ziele animiert, die aus der Schlussszene entfernt wurden. Eins
"call" das Einblenden des neuen Ziels in der Schlussszene animiert.
Für Zielansichten, die sowohl in der Start- als auch in der Endszene vorhanden sind, bietet das Framework
Ein TransitionValues
-Objekt für startValues
und
endValues
Argumente. Für Zielansichten, die nur in der Start- oder der
letzten Szene enthält, stellt das Framework ein TransitionValues
-Objekt bereit.
für das entsprechende Argument und null
für das andere Argument.
Zum Implementieren der createAnimator(ViewGroup, TransitionValues, TransitionValues)
-Funktion beim Erstellen
einen benutzerdefinierten Übergang erstellen, verwenden Sie die erfassten Werte der Ansichtseigenschaft, um ein Animator
-Objekt zu erstellen und an das Framework zurückzugeben. Ein Beispiel für eine Implementierung:
siehe Klasse ChangeColor
in der
CustomTransition-Beispiel. Weitere Informationen zu Eigenschaftsanimationen finden Sie unter
Eigenschaftsanimation:
Benutzerdefinierten Übergang anwenden
Benutzerdefinierte Übergänge funktionieren genauso wie integrierte Übergänge. Sie können einen benutzerdefinierten Übergang mit einem Transition Manager, wie unter Umstellung anwenden beschrieben.