Benutzerdefinierte Übergangsanimation erstellen

Mit einem benutzerdefinierten Übergang können Sie eine Animation erstellen, die in keiner der integrierten Übergangsklassen verfügbar ist. Sie können beispielsweise einen benutzerdefinierten Übergang definieren, bei dem die Vordergrundfarbe von Text- und Eingabefeldern grau wird. Damit wird angezeigt, dass die Felder auf dem neuen Bildschirm deaktiviert sind. Durch diese Art der Änderung sehen Nutzer die von Ihnen deaktivierten Felder.

Ein benutzerdefinierter Übergang, wie einer der integrierten Übergangstypen, wendet Animationen auf untergeordnete Ansichten der Start- und Endszene an. Im Gegensatz zu integrierten Übergangstypen müssen Sie jedoch den Code bereitstellen, der Eigenschaftswerte erfasst und Animationen generiert. Sie können auch eine Teilmenge der Zielansichten für die Animation definieren.

Auf dieser Seite erfahren Sie, wie Sie Eigenschaftswerte erfassen und Animationen generieren, um benutzerdefinierte Übergänge zu erstellen.

Die Übergangsklasse erweitern

Wenn Sie eine benutzerdefinierte Umstellung erstellen möchten, fügen Sie Ihrem Projekt eine Klasse hinzu, die die Klasse Transition 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 diese Funktionen überschrieben werden können.

Property-Werte für die Ansicht erfassen

Für Übergangsanimationen wird das unter Übersicht beschriebene Animationssystem für Eigenschaften verwendet. Durch Attributanimationen wird eine Ansichtseigenschaft über einen bestimmten Zeitraum von einem Startwert zu einem Endwert geändert. Das Framework muss daher sowohl den Start- als auch den Endwert der Eigenschaft haben, um die Animation zu erstellen.

Für eine Property-Animation wird jedoch in der Regel nur eine kleine Teilmenge aller Property-Werte der Ansicht benötigt. Für eine Farbanimation sind beispielsweise Werte für Farbeigenschaften erforderlich, für eine Bewegungsanimation hingegen Positionseigenschaftswerte. Da die für eine Animation erforderlichen Eigenschaftswerte für einen Übergang spezifisch sind, stellt das Transition-Framework nicht jeden Eigenschaftswert für einen Übergang bereit. Stattdessen ruft das Framework Callback-Funktionen auf, die einen Übergang ermöglichen, um nur die benötigten Attributwerte zu erfassen und im Framework zu speichern.

Startwerte erfassen

Implementieren Sie die Funktion captureStartValues(transitionValues), um die Werte der Startansicht an das Framework zu übergeben. Das Framework ruft diese Funktion für jede Ansicht in der Startszene auf. Das Funktionsargument ist ein TransitionValues-Objekt, das einen Verweis auf die Ansicht enthält, und eine Map-Instanz, in der Sie die gewünschten Ansichtswerte speichern können. Rufen Sie diese Attributwerte in Ihrer Implementierung ab und geben Sie sie zurück an das Framework, indem Sie sie in der Karte speichern.

Verwenden Sie das folgende Namensschema, damit der Schlüssel für einen Attributwert nicht mit anderen TransitionValues-Schlüsseln in Konflikt steht:

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) einmal für jede Zielansicht in der Endszene auf. Ansonsten funktioniert captureEndValues() genauso wie captureStartValues().

Das folgende Code-Snippet zeigt eine Implementierung der captureEndValues()-Funktion:

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

In diesem Beispiel rufen die Funktionen captureStartValues() und captureEndValues() captureValues() auf, um Werte abzurufen und zu speichern. Das von captureValues() abgerufene Attribut „view“ ist identisch, hat aber in der Start- und Endszene unterschiedliche Werte. Das Framework verwaltet separate Karten für den Start- und den Endstatus einer Ansicht.

Benutzerdefinierten Animator erstellen

Wenn Sie die Änderungen an einer Ansicht zwischen dem Status in der Startszene und dem Zustand in der Endszene animieren möchten, müssen Sie die Funktion createAnimator() überschreiben. Wenn das Framework diese Funktion aufruft, übergibt sie die Szenenstammansicht und die TransitionValues-Objekte, die die von Ihnen erfassten Start- und Endwerte enthalten.

Wie oft das Framework die Funktion createAnimator() aufruft, hängt von den Änderungen zwischen der Start- und der Endszene ab.

Stellen Sie sich z. B. eine Ausblendungs- oder Einblendanimation als benutzerdefinierten Übergang vor. Wenn die Startszene fünf Ziele hat, von denen zwei aus der Endszene entfernt werden, und die Endszene die drei Ziele aus der Startszene und ein neues Ziel hat, ruft das Framework sechsmal createAnimator() auf. Drei der Aufrufe animieren das Aus- und Einblenden der Ziele, die in beiden Szenenobjekten verbleiben. Zwei weitere Aufrufe animieren das Ausblenden der Ziele, die aus der Schlussszene entfernt wurden. Bei einem Aufruf wird das Einblenden des neuen Ziels in der Endszene animiert.

Für Zielansichten, die sowohl in der Start- als auch in der Endszene vorhanden sind, stellt das Framework ein TransitionValues-Objekt für die Argumente startValues und endValues bereit. Für Zielansichten, die nur in der Start- oder Endszene vorhanden sind, stellt das Framework ein TransitionValues-Objekt für das entsprechende Argument und null für das andere Argument bereit.

Verwenden Sie zum Implementieren der Funktion createAnimator(ViewGroup, TransitionValues, TransitionValues) beim Erstellen eines benutzerdefinierten Übergangs die von Ihnen erfassten Property-Werte für die Ansicht, um ein Animator-Objekt zu erstellen und an das Framework zurückzugeben. Eine Beispielimplementierung finden Sie in der Klasse ChangeColor im Beispiel CustomTransition. Weitere Informationen zu Property-Animatoren finden Sie unter Property-Animation.

Benutzerdefinierte Umstellung anwenden

Benutzerdefinierte Umstellungen funktionieren wie integrierte Übergänge. Mit einem Übergangsmanager können Sie eine benutzerdefinierte Umstellung anwenden, wie unter Umstellung anwenden beschrieben.