Animationen erhöhen in der Regel die visuelle Attraktivität einer App oder Website und verbessern das allgemeine Engagement der Benutzer. Laut einer Studie von Forrester Research verzeichnen Websites mit gut umgesetzten Animationen eine Steigerung des Nutzerengagements um bis zu 400 %. Ansprechende Animationen können die Aufmerksamkeit der Benutzer fesseln und sie dazu ermutigen, mehr mit der Plattform zu interagieren. Es gibt jedoch eine Lernkurve für Entwickler, um Animationen zu beherrschen, insbesondere wenn sie mit fortgeschritteneren Animationstools und -techniken arbeiten.
Als Entwickler ohne Animationserfahrung kann es im Vergleich zu anderen Animationstools oder Frameworks relativ einfach sein, Rive zu verstehen. Rive (früher bekannt als Flare) ist so konzipiert, dass es benutzerfreundlich und für Entwickler zugänglich ist, auch für diejenigen mit wenig oder keiner Vorkenntnisse im Bereich Animation. In diesem Artikel erfahren Sie, wie Sie ganz einfach einfache, atemberaubende Rive-Animationen erstellen und diese in Ihrer Flutter-App verwalten.
Einführung in Rive🧙♂️
Eine einfache interaktive Login-Animation🚀
Fazit🏋️♀️
Referenzen🧶
Rive ist ein leistungsstarkes und benutzerfreundliches Animationstool und eine Laufzeit-Engine, mit der Entwickler und Designer atemberaubende und interaktive Animationen für verschiedene Plattformen erstellen können, darunter mobile Apps, Webanwendungen und Spiele.
Hier sind die Schlüsselkonzepte:
Wir werden den Prozess durchlaufen, eine einfache Anmeldeanimation zu erstellen und sie in unsere Flutter-App zu exportieren. Wir werden die StateMachine verwenden, um die Interaktivität dieser Animation in der App zu verwalten. Am Ende sollte es so aussehen 👇🏽
Führen Sie die folgenden Schritte aus, um das Element auf der Rive-Zeichenfläche einzurichten:
Als nächstes werden wir unsere Knochen binden und sie wiegen. Durch die Bindung wird sichergestellt, dass sich die entsprechenden Teile der Oberfläche der Figur entsprechend bewegen, wenn sich ein Knochen bewegt, wodurch die Illusion einer Verformung entsteht. Bei der Gewichtung, auch Scheitelpunktgewichtung genannt, werden jedem Scheitelpunkt des Netzes der Figur Einflusswerte (Gewichtungen) zugewiesen, basierend auf seiner Nähe zu bestimmten Knochen. Wir navigieren zum Pfad der Form, die wir binden möchten. Den Hals binden wir so an den Halsknochen.
Nachdem wir die Knochen gebunden haben, legen wir die Scheitelpunkte fest, indem wir ihnen Gewichte zuweisen. Beachten Sie hier, dass wir den letzten Satz von Scheitelpunkten auf 50 % gesetzt haben, weil wir möchten, dass die beiden Knochen einen 50-prozentigen Effekt auf sie haben. Sie sollten 50 % verwenden, insbesondere wenn die festgelegten Scheitelpunkte einen Abschnitt abdecken, der die beiden Knochen betrifft. Jetzt würden wir dasselbe für den Haarpfad tun. Wir werden auch die linken und rechten Knochen von einem auf zwei Knochen ändern, um die fließende Bewegung zu erreichen, die wir für das Haar wünschen.
Wir möchten in dieser Animation einen Blinkeffekt erzielen. Um dies zu erreichen, verwenden wir die Clip-Funktion für die beiden Augenformen wie folgt 👇🏽
Als Nächstes fügen wir diesem Element die Kopfverfolgung mithilfe von Übersetzungsbeschränkungen hinzu, da wir den Kopf während der Animation bewegen möchten. Da es sich um ein 2D-Element handelt, verleiht das Hinzufügen von Übersetzungseinschränkungen ihm Tiefe und eine Art 3D-Effekt. Wählen Sie alles aus und gruppieren Sie es. Jetzt haben wir eine einzige Gruppe.
Wählen Sie dann in der oberen linken Ecke das Gruppenwerkzeug aus und erstellen Sie eine Gruppe in der Mitte des Kopfes (im Nasenbereich). Ändern Sie in der Symbolleiste auf der rechten Seite den Stil von „Gruppe“ in „Ziel“, nennen Sie es „ctrl_front“, duplizieren Sie es und benennen Sie das Duplikat „ctrl_back“.
Wählen Sie für das Ziel „ctrl_back“ in der Symbolleiste rechts die Option „Einschränkungen“ aus. Wählen Sie Übersetzungseinschränkungen aus der Liste der verfügbaren Einschränkungsoptionen aus. Klicken Sie auf das Symbol vor der ausgewählten Einschränkungsoption, um deren Eigenschaften festzulegen.
Stellen Sie die Stärke auf -100 und das Ziel auf Strg vorne ein. Wenn Sie nun die Strg-Taste nach vorne bewegen, bewegt sich die Strg-Taste nach hinten in die entgegengesetzte Richtung. Es wird uns helfen, Einschränkungen für Teile des Gesichts festzulegen, die sich in die entgegengesetzte Richtung bewegen sollen, wie z. B. die Ohren. Es sollte so aussehen 👇🏽
Jetzt legen wir Einschränkungen für den Rest des Gesichts fest. Wir werden auch die Augen (links und rechts) und Ohren (links und rechts) gruppieren, um sie besser verwalten zu können. Wir werden solche Einschränkungen für die Augen festlegen 👇🏽
Gruppe | Zwangsstärke | Ursprungsposition | Ziel |
---|---|---|---|
Gläser | 5 % | Identisch mit dem Ursprung von ctrl_front | ctrl_front |
Brauen | 10 % | Identisch mit dem Ursprung von ctrl_front | ctrl_front |
Ohren | 5 % | Der Ursprung muss nicht festgelegt werden | ctrl_back |
Nase | 5 % | Identisch mit dem Ursprung von ctrl_front | ctrl_front |
Gesicht | 5 % | Identisch mit dem Ursprung von ctrl_front | ctrl_front |
Wir müssen den Lippen keine Einschränkungen auferlegen.
So sieht es aus, nachdem wir alle unsere Einschränkungen hinzugefügt haben 👇🏽
💃🏽 🥳 Herzlichen Glückwunsch, wir haben unser Element erfolgreich für die Art von Animation vorbereitet, die wir erreichen möchten. Wütend!!
Klicken Sie in der Symbolleiste rechts auf die Schaltfläche „Animieren“ , um zur Animationsoberfläche zu wechseln. Wir werden sechs Animationszeitleisten erstellen und alles mit einer Zustandsmaschine verknüpfen. In der Zeitleiste können wir mithilfe dessen, was wir zuvor mit Knochen und Einschränkungen eingerichtet haben, Keyframes festlegen, um die Animation zu erstellen, die wir erreichen möchten.
Die erste Timeline-Animation ist die Leerlaufanimation. Es handelt sich um den Ruhezustand der Animation. Wir verwenden dies, wenn das animierte Element nicht aktiviert ist.
Für diese Leerlaufanimation erzeugen wir eine Illusion aus Atmung, leichten Haarbewegungen und Blinzeln. Anhand des Halsknochens, der Haarknochen und der Elemente für das rechte/linke Auge werden wir die erforderlichen Keyframes in verschiedenen Posen festlegen, was bedeutet, dass wir die spezifischen Eigenschaften des ausgewählten Elements an den Punkten auf der Zeitachse festlegen können. Unter Berücksichtigung des Übergangsstils von einem Keyframe zum nächsten wählen wir die Art der Interpolation aus, die wir benötigen. Sie finden es unten rechts im Abschnitt „Zeitleiste“. Die Interpolation erfolgt entweder gehalten, linear oder kurvenförmig, je nachdem, wie Sie von einem Keyframe zum nächsten wechseln möchten. Es wird so aussehen 👇🏽
Aus dem GIF oben können Sie erkennen, dass wir auf den verschiedenen Keyframes auf der Zeitleiste unterschiedliche Posen für die ausgewählten Elemente festgelegt haben. Dieser Übergang von einem Keyframe zum anderen bildet die Animation. Mit demselben Verfahren erstellen wir die anderen fünf Zeitleisten. Sie können hier klicken, um diese Animation anzusehen und sich die verschiedenen Zeitpläne im Detail anzusehen. Es sieht so aus 👇🏽
Wir sind am letzten Teil dieses Animationsprozesses angelangt. Eine Zustandsmaschine ist eine visuelle Möglichkeit, Animationen zu verbinden. Mit der Zustandsmaschine können wir steuern, welche Animation basierend auf der von uns festgelegten Eingabe abgespielt wird. Wir können zwei oder mehr Timeline-Animationen mischen oder überblenden, sodass sie gleichzeitig abgespielt werden. Wir müssen die richtigen Eingaben in der Zustandsmaschine auswählen, da diese zur Steuerung der Animation in der App verwendet werden.
In der Zustandsmaschine haben wir drei Arten von Eingaben:
Klicken Sie im Animationsfenster auf die Plus-Schaltfläche und erstellen Sie eine Zustandsmaschine. Wir werden es Login State Machine nennen. Dieser Name ist wichtig, da wir ihn später im Code zur Identifizierung unserer Zustandsmaschine benötigen.
Führen Sie die folgenden Schritte aus, um Ihre Zustandsmaschine einzurichten:
Nun sieht die komplette Animation in der Zustandsmaschine so aus 👇🏽
Sehen Sie sich hier die vollständige Animation und den Zustandsautomaten an.
Herzlichen Glückwunsch 🥳, wir haben unser Element erfolgreich animiert und mit einer Zustandsmaschine eingerichtet! Bevor wir jedoch die Rive-Datei exportieren, ändern wir den Hintergrund und die Hemdfarben des Charakters. Es wird so aussehen👇🏽
Die Hintergrundfarbe ist (#B581EB) und die Hemdfarbe des Charakters ist (#BD08D7)
Hier ist der Link zur Animation, um alles im Detail zu sehen
Wir werden diese Animation auf unserer Anmeldeseite verwenden. Erstellen Sie ein Flutter-App-Projekt und fügen Sie die Rive-Abhängigkeit zur pubspec.yaml
hinzu
dependencies: rive: ^0.11.12
Fügen Sie außerdem die exportierte Rive-Datei zu Ihren Projektressourcen hinzu. Jetzt können wir mit der Erstellung der Benutzeroberfläche basierend auf unserem Design fortfahren. Unser Ziel ist es, dass die Animation Folgendes bewirkt:
Wir werden zunächst einige Dinge vor der Widget Build-Funktion definieren.
///Login details String emailCred = "[email protected]"; String passwordCred = "123456"; /// input form controller FocusNode emailFocusNode = FocusNode(); TextEditingController emailCtr = TextEditingController(); FocusNode passwordFocusNode = FocusNode(); TextEditingController passwordCtr = TextEditingController(); /// rive controller and input values StateMachineController? controller; SMIInput<bool>? check; SMIInput<double>? look; SMIInput<bool>? success; SMIInput<bool>? fail; bool isLoading = false; bool isError = false; @override void initState() { emailFocusNode.addListener(emailFocus); passwordFocusNode.addListener(passwordFocus); super.initState(); } @override void dispose() { emailFocusNode.removeListener(emailFocus); passwordFocusNode.removeListener(passwordFocus); super.dispose(); } void emailFocus() { check?.change(emailFocusNode.hasFocus); } void passwordFocus() { check?.change(passwordFocusNode.hasFocus); }
Hier können wir Folgendes feststellen:
emailFocus
und passwordFocus
wird die Prüfeingabe basierend auf dem booleschen FocusNode.hasFocus
geändertinitState
und dispose
, dass die Listener hinzugefügt und entfernt werden. Die Zuhörer sind es gewohnt, Fokusveränderungen zuzuhören.
Sie können sich den Code für die Benutzeroberfläche und den Rest des Codes hier ansehen. Dieser Code zeigt, wie man das RiveAsset hinzufügt:
SizedBox( height: 250, width: 250, child: RiveAnimation.asset( "assets/login_screen.riv", fit: BoxFit.fitHeight, stateMachines: const ["Login State Machine"], onInit: (artboard) { controller = StateMachineController.fromArtboard( artboard, "Login State Machine", ); if (controller == null) return; artboard.addController(controller!); check = controller?.findInput("check"); look = controller?.findInput("look"); success = controller?.findInput("success"); fail = controller?.findInput("fail"); }, ), ),
Aus dem obigen Code können wir Folgendes feststellen:
Hier ist der Code für die Login-Funktion:
void login()async{ //extract the text coming from the text fields final email = emailCtr.text; final password = passwordCtr.text; //Set loading boolean to true and delay to give an illusion of loading setState(() { isLoading = true; }); await Future.delayed( const Duration(milliseconds: 2000), ); // check if details entered is the same as the correct creditials defined if (email == emailCred && password == passwordCred) { //if correct trigger the success input and set error boolean to false success?.change(true); setState(() { isError = false; }); if(context.mounted){ // delay and navigate to home screen await Future.delayed( const Duration(seconds: 2),(){ Navigator.push(context, MaterialPageRoute(builder: (context) =>const HomeScreen())); }); } } else { // if details don't match defined credentials // set error boolean to true and trigger the fail input // set loading boolean to false setState(() { isError = true; }); fail?.change(true); } setState(() { isLoading = false; }); }
Sehen Sie sich den vollständigen Code hier an.
Damit haben wir unseren Login-Animationscode fertiggestellt. So sieht alles aus:
Glückwunsch! Wir haben diese einfache interaktive Anmeldeanimation fertiggestellt. Hier finden Sie einen Überblick über alles, was wir erreichen konnten:
Wenn Sie dieses Tutorial Schritt für Schritt befolgen, kann es sein, dass Sie auf einige Engpässe stoßen, aber mit etwas Übung wird es einfacher. Sie können mich auf Twitter erreichen oder kommentieren, wenn Sie Hilfe bei der Durchführung dieses Tutorials benötigen.
Schauen Sie sich diese Video-Tutorials an, um die Rive-Animation besser zu verstehen
Sie können auch auf dem Rive-Kanal nach mehreren Video-Tutorials zu Rive-Animationen suchen.
Auch hier veröffentlicht.