Einfache Animationen in Xamarin.Forms
Die ViewExtensions-Klasse stellt Erweiterungsmethoden bereit, die zum Erstellen einfacher Animationen verwendet werden können. In diesem Artikel wird das Erstellen und Abbrechen von Animationen mithilfe der ViewExtensions-Klasse veranschaulicht.
Die ViewExtensions
-Klasse stellt die folgenden Erweiterungsmethoden bereit, die zum Erstellen einfacher Animationen verwendet werden können:
CancelAnimations
bricht alle Animationen ab.FadeTo
animiert dieOpacity
-Eigenschaft einesVisualElement
.RelScaleTo
wendet eine animierte inkrementelle Erhöhung oder Verkleinerung auf dieScale
-Eigenschaft eines anVisualElement
.RotateTo
animiert dieRotation
-Eigenschaft einesVisualElement
.RelRotateTo
wendet eine animierte inkrementelle Erhöhung oder Verkleinerung auf dieRotation
-Eigenschaft eines anVisualElement
.RotateXTo
animiert dieRotationX
-Eigenschaft einesVisualElement
.RotateYTo
animiert dieRotationY
-Eigenschaft einesVisualElement
.ScaleTo
animiert dieScale
-Eigenschaft einesVisualElement
.ScaleXTo
animiert dieScaleX
-Eigenschaft einesVisualElement
.ScaleYTo
animiert dieScaleY
-Eigenschaft einesVisualElement
.TranslateTo
animiert dieTranslationX
Eigenschaften undTranslationY
vonVisualElement
.
Standardmäßig dauert jede Animation 250 Millisekunden. Beim Erstellen der Animation kann jedoch eine Dauer für jede Animation angegeben werden.
Hinweis
Die ViewExtensions
-Klasse stellt eine LayoutTo
Erweiterungsmethode bereit. Diese Methode soll jedoch von Layouts verwendet werden, um Übergänge zwischen Layoutzuständen zu animieren, die Größen- und Positionsänderungen enthalten. Daher sollte sie nur von Layout
Unterklassen verwendet werden.
Die Animationserweiterungsmethoden in der ViewExtensions
-Klasse sind alle asynchron und geben ein Task<bool>
-Objekt zurück. Der Rückgabewert ist false
, wenn die Animation abgeschlossen ist und true
die Animation abgebrochen wird. Daher sollten die Animationsmethoden in der Regel mit dem await
Operator verwendet werden, wodurch es möglich ist, einfach zu bestimmen, wann eine Animation abgeschlossen wurde. Darüber hinaus wird es dann möglich, sequenzielle Animationen mit nachfolgenden Animationsmethoden zu erstellen, die nach Abschluss der vorherigen Methode ausgeführt werden. Weitere Informationen finden Sie unter Zusammengesetzte Animationen.
Wenn eine Animation im Hintergrund abgeschlossen werden muss, kann der await
Operator weggelassen werden. In diesem Szenario werden die Animationserweiterungsmethoden nach dem Initiieren der Animation schnell zurückgegeben, wobei die Animation im Hintergrund auftritt. Dieser Vorgang kann beim Erstellen zusammengesetzter Animationen genutzt werden. Weitere Informationen finden Sie unter Zusammengesetzte Animationen.
Weitere Informationen zum Operator finden Sie unter Übersicht über die await
Async-Unterstützung.
Einzelne Animationen
Jede Erweiterungsmethode im ViewExtensions
implementiert einen einzelnen Animationsvorgang, der eine Eigenschaft über einen bestimmten Zeitraum schrittweise von einem Wert in einen anderen ändert. In diesem Abschnitt werden die einzelnen Animationsvorgänge erläutert.
Drehung
Im folgenden Codebeispiel wird die Verwendung der RotateTo
-Methode zum Animieren der Rotation
-Eigenschaft eines Image
veranschaulicht:
await image.RotateTo (360, 2000);
image.Rotation = 0;
Dieser Code animiert die Image
instance, indem er sich um bis zu 360 Grad über 2 Sekunden (2000 Millisekunden) dreht. Die RotateTo
-Methode ruft den aktuellen Rotation
Eigenschaftswert für den Anfang der Animation ab und rotiert dann von diesem Wert zum ersten Argument (360). Sobald die Animation abgeschlossen ist, wird die Eigenschaft des Bilds Rotation
auf 0 zurückgesetzt. Dadurch wird sichergestellt, dass die Rotation
Eigenschaft nach Abschluss der Animation nicht bei 360 verbleibt, was zusätzliche Drehungen verhindert.
Die folgenden Screenshots zeigen, wie die Drehung auf jeder Plattform ausgeführt wird:
Hinweis
Zusätzlich zur RotateTo
-Methode gibt es auch RotateXTo
- und RotateYTo
-Methoden, die die RotationX
Eigenschaften und RotationY
animieren.
Relative Drehung
Das folgende Codebeispiel veranschaulicht die Verwendung der RelRotateTo
-Methode zum inkrementellen Erhöhen oder Verringern der Rotation
-Eigenschaft von Image
:
await image.RelRotateTo (360, 2000);
Dieser Code animiert den Image
instance, indem er sich um 360 Grad von seiner Startposition über 2 Sekunden (2000 Millisekunden) dreht. Die RelRotateTo
-Methode ruft den aktuellen Rotation
Eigenschaftswert für den Anfang der Animation ab und rotiert dann von diesem Wert zum Wert plus dem ersten Argument (360). Dadurch wird sichergestellt, dass jede Animation immer eine Drehung um 360 Grad von der Startposition hat. Wenn also eine neue Animation aufgerufen wird, während eine Animation bereits ausgeführt wird, beginnt sie an der aktuellen Position und endet möglicherweise an einer Position, die kein Inkrement von 360 Grad ist.
Die folgenden Screenshots zeigen die relative Drehung, die auf jeder Plattform ausgeführt wird:
Skalierung
Im folgenden Codebeispiel wird die Verwendung der ScaleTo
-Methode zum Animieren der Scale
-Eigenschaft eines Image
veranschaulicht:
await image.ScaleTo (2, 2000);
Dieser Code animiert den Image
instance, indem er über 2 Sekunden (2.000 Millisekunden) auf das Doppelte skaliert wird. Die ScaleTo
-Methode ruft den aktuellen Scale
Eigenschaftswert (Standardwert 1) für den Anfang der Animation ab und skaliert dann von diesem Wert auf das erste Argument (2). Dies hat zur Folge, dass die Größe des Bilds auf die doppelte Größe erweitert wird.
Die folgenden Screenshots zeigen die laufende Skalierung auf jeder Plattform:
Hinweis
Zusätzlich zur ScaleTo
-Methode gibt es auch ScaleXTo
- und ScaleYTo
-Methoden, die die ScaleX
Eigenschaften und ScaleY
animieren.
Relative Skalierung
Im folgenden Codebeispiel wird die Verwendung der RelScaleTo
-Methode zum Animieren der Scale
-Eigenschaft eines Image
veranschaulicht:
await image.RelScaleTo (2, 2000);
Dieser Code animiert den Image
instance, indem er über 2 Sekunden (2.000 Millisekunden) auf das Doppelte skaliert wird. Die RelScaleTo
-Methode ruft den aktuellen Scale
Eigenschaftswert für den Anfang der Animation ab und skaliert dann von diesem Wert auf den Wert plus dem ersten Argument (2). Dadurch wird sichergestellt, dass jede Animation von der Startposition aus immer eine Skalierung von 2 ist.
Skalieren und Drehen mit Ankern
Die AnchorX
Eigenschaften und AnchorY
legen den Mittelpunkt der Skalierung oder Drehung für die Rotation
Eigenschaften und Scale
fest. Daher wirken sich ihre Werte auch auf die RotateTo
Methoden und aus ScaleTo
.
Bei einer Image
, die in der Mitte eines Layouts platziert wurde, veranschaulicht das folgende Codebeispiel das Drehen des Bilds um die Mitte des Layouts durch Festlegen AnchorY
der -Eigenschaft:
double radius = Math.Min(absoluteLayout.Width, absoluteLayout.Height) / 2;
image.AnchorY = radius / image.Height;
await image.RotateTo(360, 2000);
Um die Image
instance um die Mitte des Layouts zu drehen, müssen die AnchorX
Eigenschaften und AnchorY
auf Werte festgelegt werden, die relativ zur Breite und Höhe des Image
sind. In diesem Beispiel ist die Mitte von Image
so definiert, dass sie sich in der Mitte des Layouts befindet, sodass der Standardwert AnchorX
0,5 keine Änderung erfordert. Die Eigenschaft wird jedoch neu definiert, AnchorY
um einen Wert vom oberen Rand des Image
bis zum Mittelpunkt des Layouts zu sein. Dadurch wird sichergestellt, dass eine Image
vollständige Drehung von 360 Grad um den Mittelpunkt des Layouts ausgeführt wird, wie in den folgenden Screenshots gezeigt:
Übersetzung
Das folgende Codebeispiel veranschaulicht die Verwendung der TranslateTo
-Methode zum Animieren der TranslationX
Eigenschaften und TranslationY
von Image
:
await image.TranslateTo (-100, -100, 1000);
Dieser Code animiert die Image
instance, indem er sie horizontal und vertikal über 1 Sekunde (1000 Millisekunden) übersetzt. Die TranslateTo
-Methode übersetzt das Bild gleichzeitig 100 Pixel nach links und 100 Pixel nach oben. Dies liegt daran, dass das erste und das zweite Argument beide negative Zahlen sind. Die Angabe positiver Zahlen würde das Bild nach rechts und nach unten übersetzen.
Die folgenden Screenshots zeigen, wie die Übersetzung auf jeder Plattform ausgeführt wird:
Hinweis
Wenn ein Element zunächst außerhalb des Bildschirms angeordnet und dann auf den Bildschirm übersetzt wird, bleibt das Eingabelayout des Elements nach der Übersetzung außerhalb des Bildschirms und der Benutzer kann nicht mit dem Element interagieren. Daher wird empfohlen, dass eine Ansicht an ihrer endgültigen Position angeordnet wird und dann alle erforderlichen Übersetzungen durchgeführt werden.
Ausblenden
Im folgenden Codebeispiel wird die Verwendung der FadeTo
-Methode zum Animieren der Opacity
-Eigenschaft eines Image
veranschaulicht:
image.Opacity = 0;
await image.FadeTo (1, 4000);
Dieser Code animiert die Image
instance, indem er ihn in mehr als 4 Sekunden (4000 Millisekunden) ausblendet. Die FadeTo
-Methode ruft den aktuellen Opacity
Eigenschaftswert für den Anfang der Animation ab und blendet dann von diesem Wert bis zum ersten Argument (1) aus.
Die folgenden Screenshots zeigen, dass die Einblendung auf jeder Plattform ausgeführt wird:
Zusammengesetzte Animationen
Eine zusammengesetzte Animation ist eine sequenzielle Kombination von Animationen und kann mit dem await
Operator erstellt werden, wie im folgenden Codebeispiel veranschaulicht:
await image.TranslateTo (-100, 0, 1000); // Move image left
await image.TranslateTo (-100, -100, 1000); // Move image diagonally up and left
await image.TranslateTo (100, 100, 2000); // Move image diagonally down and right
await image.TranslateTo (0, 100, 1000); // Move image left
await image.TranslateTo (0, 0, 1000); // Move image up
In diesem Beispiel wird der Image
über 6 Sekunden (6000 Millisekunden) übersetzt. Die Übersetzung von Image
verwendet fünf Animationen, wobei der await
Operator angibt, dass jede Animation sequenziell ausgeführt wird. Daher werden nachfolgende Animationsmethoden ausgeführt, nachdem die vorherige Methode abgeschlossen wurde.
Zusammengesetzte Animationen
Eine zusammengesetzte Animation ist eine Kombination aus Animationen, bei der zwei oder mehr Animationen gleichzeitig ausgeführt werden. Zusammengesetzte Animationen können erstellt werden, indem erwartete und nicht erwartete Animationen gemischt werden, wie im folgenden Codebeispiel veranschaulicht:
image.RotateTo (360, 4000);
await image.ScaleTo (2, 2000);
await image.ScaleTo (1, 2000);
In diesem Beispiel wird der Image
skaliert und gleichzeitig über 4 Sekunden (4000 Millisekunden) gedreht. Die Skalierung von Image
verwendet zwei sequenzielle Animationen, die gleichzeitig mit der Drehung auftreten. Die RotateTo
-Methode wird ohne operator await
ausgeführt und gibt sofort zurück, wobei die erste ScaleTo
Animation dann beginnt. Der await
Operator für den ersten ScaleTo
Methodenaufruf verzögert den zweiten ScaleTo
Methodenaufruf, bis der erste ScaleTo
Methodenaufruf abgeschlossen ist. An diesem Punkt ist die RotateTo
Animation halbwegs abgeschlossen und wird Image
um 180 Grad gedreht. Während der letzten 2 Sekunden (2000 Millisekunden) werden sowohl die zweite ScaleTo
Animation als auch die RotateTo
Animation abgeschlossen.
Gleichzeitiges Ausführen mehrerer asynchroner Methoden
Die static
Task.WhenAny
Methoden und Task.WhenAll
werden verwendet, um mehrere asynchrone Methoden gleichzeitig auszuführen und können daher zum Erstellen zusammengesetzter Animationen verwendet werden. Beide Methoden geben ein Task
-Objekt zurück und akzeptieren eine Auflistung von Methoden, die jeweils ein Task
-Objekt zurückgeben. Die Task.WhenAny
-Methode wird abgeschlossen, wenn eine Methode in ihrer Auflistung die Ausführung abgeschlossen hat, wie im folgenden Codebeispiel veranschaulicht:
await Task.WhenAny<bool>
(
image.RotateTo (360, 4000),
image.ScaleTo (2, 2000)
);
await image.ScaleTo (1, 2000);
In diesem Beispiel enthält der Task.WhenAny
Methodenaufruf zwei Aufgaben. Der erste Task rotiert das Bild über 4 Sekunden (4000 Millisekunden), und der zweite Vorgang skaliert das Bild über 2 Sekunden (2000 Millisekunden). Wenn die zweite Aufgabe abgeschlossen ist, wird der Task.WhenAny
Methodenaufruf abgeschlossen. Obwohl die RotateTo
Methode noch ausgeführt wird, kann die zweite ScaleTo
Methode beginnen.
Die Task.WhenAll
-Methode wird abgeschlossen, wenn alle Methoden in ihrer Auflistung abgeschlossen sind, wie im folgenden Codebeispiel veranschaulicht:
// 10 minute animation
uint duration = 10 * 60 * 1000;
await Task.WhenAll (
image.RotateTo (307 * 360, duration),
image.RotateXTo (251 * 360, duration),
image.RotateYTo (199 * 360, duration)
);
In diesem Beispiel enthält der Task.WhenAll
Methodenaufruf drei Aufgaben, die jeweils über 10 Minuten ausgeführt werden. Jede Task
ergibt eine andere Anzahl von 360 Grad Drehungen – 307 Drehungen für RotateTo
, 251 Drehungen für RotateXTo
und 199 Drehungen für RotateYTo
. Bei diesen Werten handelt es sich um Primzahlen, sodass sichergestellt wird, dass die Drehungen nicht synchronisiert werden und daher nicht zu sich wiederholenden Mustern führen.
Die folgenden Screenshots zeigen die verschiedenen Drehungen, die auf jeder Plattform ausgeführt werden:
Abbrechen von Animationen
Eine Anwendung kann eine oder mehrere Animationen mit einem Aufruf der CancelAnimations
Erweiterungsmethode abbrechen, wie im folgenden Codebeispiel veranschaulicht:
image.CancelAnimations();
Dadurch werden sofort alle Animationen abgebrochen, die derzeit auf dem Image
instance ausgeführt werden.
Zusammenfassung
In diesem Artikel wurde das Erstellen und Abbrechen von Animationen mithilfe der ViewExtensions
-Klasse veranschaulicht. Diese Klasse stellt Erweiterungsmethoden bereit, mit denen einfache Animationen erstellt werden können, die Instanzen rotieren, skalieren, übersetzen und ausblenden VisualElement
.