Benutzerdefinierte Übergangsanimation erstellen

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.