Objekte auf dem Bildschirm müssen aufgrund von Nutzerinteraktionen oder Hintergrundprozessen oft neu positioniert werden. Anstatt die Position des Objekts sofort zu aktualisieren, wodurch es von einem Bereich zum anderen blinkt, verwenden Sie eine Animation, um es von der Start- zur Endposition zu bewegen.
Eine Möglichkeit, Ansichtsobjekte auf dem Bildschirm neu zu positionieren, ist die Verwendung von
ObjectAnimator. Sie geben die Endposition an, an der sich das Objekt befinden soll, sowie die Dauer der Animation. Sie können auch Zeitinterpolatoren verwenden, um die Beschleunigung oder Verlangsamung der Animation zu steuern.
Ansichtsposition mit ObjectAnimator ändern
Die ObjectAnimator
-API bietet eine Möglichkeit, die Eigenschaften einer Ansicht mit einer bestimmten Dauer zu ändern.
Sie enthält statische Methoden zum Erstellen von Instanzen von ObjectAnimator, je nachdem, welche Art von Attribut Sie animieren. Verwenden Sie die Attribute translationX und translationY, um Ihre Ansichten auf dem Bildschirm neu zu positionieren.
Hier ist ein Beispiel für einen ObjectAnimator, der die Ansicht in 2 Sekunden um 100 Pixel von der linken Seite des Bildschirms entfernt positioniert:
Kotlin
ObjectAnimator.ofFloat(view, "translationX", 100f).apply { duration = 2000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setDuration(2000); animation.start();
In diesem Beispiel wird die
ObjectAnimator.ofFloat()
Methode verwendet, da die Übersetzungswerte Gleitkommazahlen sein müssen. Der erste Parameter ist die Ansicht, die Sie animieren möchten. Der zweite Parameter ist die Eigenschaft, die Sie animieren. Da sich die Ansicht horizontal bewegen muss, wird die Eigenschaft translationX verwendet. Der letzte Parameter ist der Endwert der Animation. In diesem Beispiel gibt der Wert 100 eine Position an, die viele Pixel von der linken Seite des Bildschirms entfernt ist.
Die nächste Methode gibt an, wie lange die Animation dauert (in Millisekunden). In diesem Beispiel dauert die Animation 2 Sekunden (2.000 Millisekunden).
Die letzte Methode führt die Animation aus und aktualisiert die Position der Ansicht auf dem Bildschirm.
Weitere Informationen zur Verwendung von ObjectAnimator finden Sie unter Mit
ObjectAnimator animieren.
Gekrümmte Bewegung hinzufügen
Die Verwendung von ObjectAnimator ist zwar praktisch, aber standardmäßig wird die Ansicht entlang einer geraden Linie zwischen dem Start- und dem Endpunkt neu positioniert. Material Design verwendet Kurven für die räumliche Bewegung von Objekten auf dem Bildschirm und für das Timing einer Animation. Durch die Verwendung von gekrümmten Bewegungen erhält Ihre App ein materialähnlicheres Aussehen und Ihre Animationen werden interessanter.
Eigenen Pfad definieren
Die Klasse ObjectAnimator hat Konstruktoren, mit denen Sie Koordinaten mit zwei oder mehr Eigenschaften gleichzeitig entlang eines Pfads animieren können. Der
folgende Animator verwendet beispielsweise ein
Path-Objekt, um die X- und Y
-Eigenschaften einer Ansicht zu animieren:
Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true) } val animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path).apply { duration = 2000 start() } } else { // Create animator without using curved path }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true); ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); animator.setDuration(2000); animator.start(); } else { // Create animator without using curved path }
So sieht die Bogenanimation aus:
Abbildung 1 : Eine Animation mit gekrümmtem Pfad.
Ein Interpolator
ist eine Implementierung einer Easing-Kurve. Weitere Informationen zum Konzept der Easing-Kurven finden Sie in der
Material Design-Dokumentation. Ein Interpolator definiert, wie bestimmte Werte in einer Animation als Funktion der Zeit berechnet werden. Das System stellt XML-Ressourcen für die drei grundlegenden Kurven in der Material Design-Spezifikation bereit:
@interpolator/fast_out_linear_in.xml@interpolator/fast_out_slow_in.xml@interpolator/linear_out_slow_in.xml
PathInterpolator verwenden
Die
PathInterpolator
Klasse ist ein Interpolator, der in Android 5.0 (API 21) eingeführt wurde. Sie basiert auf einer
Bézier-Kurve oder einem
Path Objekt. In den Android-Beispielen in der Material Design-Dokumentation für
Easing
wird PathInterpolator verwendet.
PathInterpolator hat Konstruktoren, die auf verschiedenen Arten von Bézier-Kurven basieren.
Alle Bézier-Kurven haben Start- und Endpunkte, die auf (0,0) bzw. (1,1) festgelegt sind. Die anderen Konstruktorargumente hängen von der Art der zu erstellenden Bézier-Kurve ab.
Für eine quadratische Bézier-Kurve sind beispielsweise nur die X- und Y-Koordinaten eines Kontrollpunkts erforderlich:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.67f, 0.33f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.67f, 0.33f); } else { myInterpolator = new LinearInterpolator(); }
Dadurch wird eine Easing-Kurve erzeugt, die schnell beginnt und sich zum Ende hin verlangsamt.
Der kubische Bézier-Konstruktor hat ebenfalls feste Start- und Endpunkte, erfordert aber zwei Kontrollpunkte:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f); } else { myInterpolator = new LinearInterpolator(); }
Dies ist eine Implementierung der Easing-Kurve emphasized decelerate von Material Design.
Für eine genauere Steuerung kann ein beliebiger Path verwendet werden, um die Kurve zu definieren:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { moveTo(0.0f, 0.0f) cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f) } PathInterpolator(path) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f); myInterpolator = new PathInterpolator(path); } else { myInterpolator = new LinearInterpolator(); }
Dadurch wird dieselbe Easing-Kurve wie im kubischen Bézier-Beispiel erzeugt, aber stattdessen wird ein Path verwendet.
Sie können auch einen Pfadinterpolator als XML-Ressource definieren:
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.5"
android:controlY1="0.7"
android:controlX2="0.1f"
android:controlY2="1.0f"/>
Nachdem Sie ein PathInterpolator Objekt erstellt haben, können Sie es an die
Animator.setInterpolator()
Methode übergeben. Der Animator verwendet den Interpolator, um das Timing oder die Pfadkurve zu bestimmen, wenn er gestartet wird.
Kotlin
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply { interpolator = myInterpolator start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setInterpolator(myInterpolator); animation.start();