Les animations augmentent généralement l'attrait visuel d'une application ou d'un site Web et améliorent l'engagement global des utilisateurs. Selon une étude de Forrester Research, les sites Web avec des animations bien exécutées connaissent une augmentation de l'engagement des utilisateurs pouvant atteindre 400 %. Des animations engageantes peuvent capter l'attention des utilisateurs et les encourager à interagir davantage avec la plateforme. Cependant, les développeurs doivent apprendre à maîtriser l'animation, en particulier lorsqu'ils travaillent avec des outils et des techniques d'animation plus avancés.
Saisir Rive en tant que développeur sans expérience en animation peut être relativement facile par rapport à d'autres outils ou frameworks d'animation. Rive (anciennement connu sous le nom de Flare) est conçu pour être convivial et accessible aux développeurs, même ceux qui ont peu ou pas d'expérience en animation. Dans cet article, vous apprendrez à créer facilement de superbes animations Rive simples et à les gérer dans votre application Flutter.
Introduction à Rive🧙♂️
Une animation de connexion interactive simple🚀
Conclusion🏋️♀️
Références🧶
Rive est un outil d'animation et un moteur d'exécution puissants et conviviaux qui permettent aux développeurs et aux concepteurs de créer des animations époustouflantes et interactives pour diverses plates-formes, notamment des applications mobiles, des applications Web et des jeux.
Voici les notions clés :
Nous allons passer par le processus de création d'une animation de connexion simple et l'exporter vers notre application Flutter. Nous utiliserons la StateMachine pour gérer l'interactivité de cette animation dans l'application. Au final, ça devrait ressembler à ça 👇🏽
Suivez les étapes ci-dessous pour configurer l'élément sur le plan de travail Rive :
Ensuite, nous allons lier nos os et les peser. La liaison garantit que lorsqu'un os se déplace, les parties correspondantes de la surface du personnage se déplacent en conséquence, créant l'illusion de déformation. La pondération, également connue sous le nom de pondération des sommets, consiste à attribuer des valeurs d'influence (poids) à chaque sommet du maillage du personnage en fonction de sa proximité avec des os spécifiques. Nous allons naviguer vers le chemin de la forme que nous lierions. Pour le cou, c'est ainsi que nous le lions à l'os du cou.
Après avoir lié les os, nous définissons les sommets en leur attribuant des poids. Ici, notez que nous avons mis le dernier ensemble de sommets à 50% car nous voulons que les deux os aient un effet de 50% sur eux. Vous devez utiliser 50 %, en particulier lorsque les sommets définis couvrent une section qui affecte les deux os. Maintenant, nous ferions la même chose pour le chemin des cheveux. Nous allons également changer les os gauche et droit d'un à deux os pour nous aider à obtenir le mouvement fluide que nous voulons pour les cheveux.
Nous voudrions avoir un effet clignotant dans cette animation, pour y parvenir, nous allons utiliser la fonction clip sur les deux formes d'yeux comme celle-ci 👇🏽
Ensuite, nous ajouterons le suivi de la tête en utilisant des contraintes de translation à cet élément car nous voulons déplacer la tête pendant l'animation. Puisqu'il s'agit d'un élément 2D, l'ajout de contraintes de translation lui donnera de la profondeur et une certaine forme d'effet 3D. Sélectionnez tout et groupez-le. Maintenant, nous avons un seul groupe.
Ensuite, dans le coin supérieur gauche, sélectionnez l'outil de groupe et créez un groupe au centre de la tête (au niveau du nez). Dans la barre d'outils de droite, changez son style de groupe en cible, nommez-le ctrl_front, dupliquez-le et nommez le doublon ctrl_back.
Pour la cible ctrl_back, sélectionnez l'option contraintes dans la barre d'outils à droite. Sélectionnez les contraintes de traduction dans la liste des options de contraintes disponibles. Cliquez sur l'icône devant l'option de contrainte sélectionnée pour définir ses propriétés.
Réglez la force sur -100 et définissez sa cible sur ctrl avant. Maintenant, lorsque vous déplacez le ctrl avant, le ctrl arrière se déplace dans la direction opposée. Cela nous aidera à définir des contraintes pour les parties du visage qui doivent se déplacer dans une direction opposée, comme les oreilles. Ça devrait ressembler à ça 👇🏽
Nous allons maintenant définir des contraintes pour le reste du visage. Nous regrouperons également les yeux (gauche et droit) et les oreilles (gauche et droite) pour nous aider à mieux les gérer. On va mettre des contraintes pour les yeux comme ça 👇🏽
Groupe | Force de contrainte | Position d'origine | Cible |
---|---|---|---|
lunettes | 5% | identique à l'origine ctrl_front | ctrl_front |
les sourcils | dix% | identique à l'origine ctrl_front | ctrl_front |
oreilles | 5% | pas besoin de définir l'origine | ctrl_retour |
nez | 5% | identique à l'origine ctrl_front | ctrl_front |
affronter | 5% | identique à l'origine ctrl_front | ctrl_front |
Nous n'avons pas besoin de définir des contraintes pour les lèvres.
Voilà à quoi ça ressemble après avoir fini d'ajouter toutes nos contraintes 👇🏽
💃🏽 🥳 Félicitations, nous avons réussi à préparer notre élément pour le type d'animation que nous voulons réaliser. Ouf!!
Dans la barre d'outils à droite, cliquez sur le bouton Animer pour passer à l'interface d'animation. Nous allons créer six chronologies d'animation et lier le tout avec une machine d'état. Dans la timeline, en utilisant ce que nous avons mis en place précédemment avec des os et des contraintes, nous pouvons définir des images clés pour créer l'animation que nous voulons réaliser.
La première animation de la chronologie est l'animation inactive. Ce sera l'état inactif de l'animation. Nous l'utiliserons lorsque l'élément animé n'est pas engagé.
Pour cette animation inactive, nous allons créer une illusion de respiration, de légers mouvements de cheveux et de clignotement. En utilisant l'os du cou, les os des cheveux et les éléments de l'œil droit/gauche, nous définirons les images clés nécessaires dans différentes poses, ce qui signifie que nous pouvons définir les propriétés spécifiques de l'élément sélectionné sur les points de la chronologie. En tenant compte du style de transition d'une image clé à la suivante, nous choisirons le type d'interpolation dont nous avons besoin. Vous pouvez le trouver en bas vers la droite de la section Chronologie. L'interpolation est soit maintenue, linéaire ou courbe, selon la façon dont vous souhaitez passer d'une image clé à la suivante. Ça ressemblera à ça 👇🏽
À partir du gif ci-dessus, vous pouvez remarquer que sur les différentes images clés de la chronologie, nous avons défini différentes poses pour les éléments sélectionnés. Cette transition d'une image clé à l'autre forme l'animation. En utilisant cette même procédure, nous allons créer les cinq autres chronologies. Vous pouvez cliquer ici pour voir cette animation et consulter les différentes chronologies en détail. Ça ressemble à ça 👇🏽
Nous sommes arrivés à la dernière partie de ce processus d'animation. Une machine d'état est un moyen visuel de connecter l'animation. À l'aide de la machine d'état, nous pouvons contrôler quelle animation est lue en fonction de l'entrée que nous avons définie. Nous pouvons mélanger ou fusionner deux animations chronologiques ou plus afin qu'elles soient lues simultanément. Nous devons sélectionner le bon type d'entrées dans la machine d'état car c'est ce que nous utiliserons pour contrôler l'animation dans l'application.
Dans la machine d'état, nous avons trois types d'entrées :
Dans le panneau Animation, cliquez sur le bouton plus et créez une machine d'état. Nous l'appellerons Login State Machine . Ce nom est important car c'est ce dont nous aurons besoin pour identifier notre machine d'état plus tard dans le code.
Suivez les étapes ci-dessous pour configurer votre machine d'état :
Maintenant, l'animation complète dans la machine d'état ressemblera à ceci 👇🏽
Découvrez l'animation complète et la machine d'état ici .
Félicitations 🥳, nous avons réussi à animer notre élément et à le paramétrer avec une machine d'état ! Cependant, avant d'exporter le fichier rive, nous allons changer l'arrière-plan et les couleurs de la chemise du personnage. Ça ressemblera à ça👇🏽
La couleur de fond est (#B581EB) et la couleur de la chemise du personnage est (#BD08D7)
Voici le lien vers l'animation pour tout voir en détail
Nous utiliserons cette animation sur notre page de connexion. Créez un projet d'application Flutter et ajoutez la dépendance Rive au pubspec.yaml
dependencies: rive: ^0.11.12
Ajoutez également le fichier Rive exporté aux actifs de votre projet. Nous pouvons maintenant continuer à créer l'interface utilisateur basée sur notre conception. Notre objectif est que l'animation fasse ce qui suit :
Nous allons d'abord définir certaines choses avant la fonction Widget Build.
///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); }
Ici, nous pouvons noter ce qui suit :
emailFocus
et passwordFocus
, l'entrée de vérification est modifiée en fonction du booléen FocusNode.hasFocus
initState
et dispose
, nous voyons les écouteurs sont ajoutés et supprimés. Les auditeurs sont habitués à écouter les changements d'orientation.
Vous pouvez consulter le code de l'interface utilisateur et le reste du code ici . Ce morceau de code montre comment ajouter le RiveAsset :
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"); }, ), ),
À partir du code ci-dessus, nous pouvons noter ce qui suit :
Voici le code de la fonction de connexion :
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; }); }
Découvrez le code complet ici .
En faisant cela, nous avons complété notre code d'animation de connexion. Voici à quoi tout ressemble:
Toutes nos félicitations! Nous avons terminé cette animation de connexion interactive simple. Voici un aperçu de tout ce que nous avons pu accomplir :
En suivant ce didacticiel étape par étape, vous pourriez rencontrer quelques goulots d'étranglement, mais cela deviendra plus facile avec la pratique. Vous pouvez me joindre sur Twitter ou commenter si vous avez besoin d'aide tout en suivant ce didacticiel.
Découvrez ces tutoriels vidéo pour mieux comprendre l'animation Rive
Vous pouvez également consulter la chaîne Rive pour plusieurs didacticiels vidéo sur les animations Rive.
Également publié ici .