Ansichten mit einer Schlauchanimation verschieben

Compose ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Informationen zur Verwendung von Animationen in Compose

Bei der Fling-basierten Animation wird eine Reibungskraft verwendet, die proportional zur Geschwindigkeit eines Objekts ist. Damit können Sie eine Eigenschaft eines Objekts animieren und die Animation allmählich beenden. Die Animation hat ein anfängliches Momentum, das hauptsächlich von der Geschwindigkeit der Geste bestimmt wird, und verlangsamt sich allmählich. Die Animation endet, wenn die Geschwindigkeit der Animation so niedrig ist, dass sie keine sichtbare Änderung auf dem Gerätebildschirm mehr bewirkt.

Abbildung 1: Fling-Animation

Weitere Informationen zu verwandten Themen finden Sie in den folgenden Leitfäden:

AndroidX-Bibliothek hinzufügen

Wenn Sie die physikbasierten Animationen verwenden möchten, müssen Sie die AndroidX-Bibliothek wie folgt zu Ihrem Projekt hinzufügen:

  1. Öffnen Sie die Datei build.gradle für Ihr App-Modul.
  2. Fügen Sie die AndroidX-Bibliothek dem Abschnitt dependencies hinzu.

    Groovy

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    Kotlin

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

Fling-Animation erstellen

Mit der Klasse FlingAnimation können Sie eine Fling-Animation für ein Objekt erstellen. Um eine Fling-Animation zu erstellen, erstellen Sie eine Instanz der Klasse FlingAnimation und geben Sie ein Objekt und die Eigenschaft des Objekts an, die animiert werden soll.

Kotlin

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

Geschwindigkeit festlegen

Die Startgeschwindigkeit definiert die Geschwindigkeit, mit der sich eine Animationseigenschaft am Anfang der Animation ändert. Die Standard-Anfangsgeschwindigkeit ist auf null Pixel pro Sekunde festgelegt. Daher müssen Sie eine Startgeschwindigkeit definieren, damit die Animation nicht sofort endet.

Sie können einen festen Wert als Startgeschwindigkeit verwenden oder die Geschwindigkeit einer Touch-Geste als Grundlage nehmen. Wenn Sie einen festen Wert angeben möchten, sollten Sie ihn in dp pro Sekunde definieren und dann in Pixel pro Sekunde umrechnen. Wenn Sie den Wert in dp pro Sekunde definieren, ist die Geschwindigkeit unabhängig von der Dichte und den Formfaktoren eines Geräts. Weitere Informationen zum Umrechnen der Startgeschwindigkeit in Pixel pro Sekunde finden Sie im Abschnitt dp pro Sekunde in Pixel pro Sekunde umrechnen unter Federanimation.

Rufen Sie die Methode setStartVelocity() auf und übergeben Sie die Geschwindigkeit in Pixel pro Sekunde, um die Geschwindigkeit festzulegen. Die Methode gibt das Fling-Objekt zurück, für das die Geschwindigkeit festgelegt ist.

Hinweis:Verwenden Sie die Klassen GestureDetector.OnGestureListener und VelocityTracker, um die Geschwindigkeit von Touch-Gesten abzurufen bzw. zu berechnen.

Animationswertebereich festlegen

Sie können die Mindest- und Höchstwerte für die Animation festlegen, wenn Sie den Eigenschaftswert auf einen bestimmten Bereich beschränken möchten. Diese Bereichssteuerung ist besonders nützlich, wenn Sie Eigenschaften animieren, die einen intrinsischen Bereich haben, z. B. Alpha (von 0 bis 1).

Hinweis: Wenn der Wert einer Fling-Animation den Minimal- oder Maximalwert erreicht, wird die Animation beendet.

Rufen Sie die Methoden setMinValue() und setMaxValue() auf, um die Mindest- und Höchstwerte festzulegen. Bei beiden Methoden wird das Animations-Objekt zurückgegeben, für das Sie den Wert festgelegt haben.

Reibung festlegen

Mit der Methode setFriction() können Sie die Reibung der Animation ändern. Sie definiert, wie schnell die Geschwindigkeit in einer Animation abnimmt.

Hinweis: Wenn Sie die Reibung am Anfang der Animation nicht festlegen, wird der Standardwert 1 verwendet.

Die Methode gibt das Objekt zurück, dessen Animation den von Ihnen angegebenen Reibungswert verwendet.

Beispielcode

Das folgende Beispiel veranschaulicht einen horizontalen Wisch. Die vom Geschwindigkeits-Tracker erfasste Geschwindigkeit ist velocityX und die Scrollgrenzen sind auf 0 und maxScroll festgelegt. Die Reibung ist auf 1,1 eingestellt.

Kotlin

FlingAnimation(view, DynamicAnimation.SCROLL_X).apply {
    setStartVelocity(-velocityX)
    setMinValue(0f)
    setMaxValue(maxScroll)
    friction = 1.1f
    start()
}

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
fling.setStartVelocity(-velocityX)
        .setMinValue(0)
        .setMaxValue(maxScroll)
        .setFriction(1.1f)
        .start();

Mindestsichtbarkeitsänderung festlegen

Wenn Sie eine benutzerdefinierte Eigenschaft animieren, die nicht in Pixeln definiert ist, sollten Sie die minimale Änderung des Animationswerts festlegen, die für Nutzer sichtbar ist. Sie bestimmt einen angemessenen Schwellenwert für das Beenden der Animation.

Es ist nicht erforderlich, diese Methode aufzurufen, wenn DynamicAnimation.ViewProperty animiert wird, da die minimale sichtbare Änderung aus der Eigenschaft abgeleitet wird. Beispiel:

  • Der Standardwert für die minimale sichtbare Änderung beträgt 1 Pixel für Ansichtseigenschaften wie TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, SCROLL_X und SCROLL_Y.
  • Bei Animationen, bei denen eine Drehung verwendet wird, z. B. ROTATION, ROTATION_X und ROTATION_Y, beträgt die minimale sichtbare Änderung MIN_VISIBLE_CHANGE_ROTATION_DEGREES oder 1/10 Pixel.
  • Bei Animationen, die die Deckkraft verwenden, beträgt die minimale sichtbare Änderung MIN_VISIBLE_CHANGE_ALPHA oder 1/256.

Wenn Sie die minimale sichtbare Änderung für eine Animation festlegen möchten, rufen Sie die Methode setMinimumVisibleChange() auf und übergeben Sie entweder eine der Konstanten für die minimale Sichtbarkeit oder einen Wert, den Sie für eine benutzerdefinierte Eigenschaft berechnen müssen. Weitere Informationen zur Berechnung dieses Werts finden Sie im Abschnitt Mindestwert für sichtbare Änderung berechnen.

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

Hinweis: Sie müssen nur dann einen Wert übergeben, wenn Sie ein benutzerdefiniertes Attribut animieren, das nicht in Pixeln definiert ist.

Berechnung eines minimal sichtbaren Änderungswerts

Verwenden Sie die folgende Formel, um den Mindestwert für sichtbare Änderungen für eine benutzerdefinierte Property zu berechnen:

Minimale sichtbare Änderung = Bereich des benutzerdefinierten Attributwerts / Bereich der Animation in Pixeln

Die Property, die animiert werden soll, ändert sich beispielsweise von 0 auf 100. Das entspricht einer Änderung von 200 Pixeln. Gemäß der Formel beträgt der minimale sichtbare Änderungswert 100 / 200 = 0, 5 Pixel.