Introduction aux animations dans .NET MAUI
Les animations constituent un élément essentiel dans le développement d'interfaces utilisateur modernes. Elles permettent d'améliorer l'expérience utilisateur en fournissant des retours visuels sur les interactions et en rendant l'application plus dynamique et engageante.
.NET MAUI offre un système d'animation puissant et flexible qui peut être facilement utilisé dans le code-behind pour créer des interfaces utilisateur interactives et dynamiques.
Théorie des animations dans .NET MAUI
Types d'animations de base
.NET MAUI prend en charge plusieurs types d'animations fondamentales :
- Fade (Opacité) : Modifications de la propriété
Opacitypour faire apparaître ou disparaître progressivement un élément. - Rotate (Rotation) : Utilisation de la propriété
Rotationpour faire pivoter un élément selon un angle spécifié. - Scale (Mise à l'échelle) : Modification de la propriété
Scalepour agrandir ou réduire un élément. - Translate (Translation) : Déplacement d'un élément en modifiant ses propriétés
TranslationXetTranslationY. - Et d'autres encore
Méthodes d'animation
.NET MAUI fournit plusieurs méthodes d'extension pour animer des éléments visuels :
FadeTo(): Anime la propriété d'opacité d'un élément.RotateTo(): Anime la rotation d'un élément.ScaleTo(): Anime la taille d'un élément.TranslateTo(): Anime la position d'un élément.
Ces méthodes retournent des Task<bool>, ce qui permet de les utiliser avec async/await pour créer des séquences d'animations.
Gestion des animations avec le code-behind
Dans une approche code behind, toute la logique de l'application et la gestion des animations sont centralisées dans le fichier xaml.cs de la page.
Les éléments clés de cette approche sont :
- Gestionnaires d'événements : Les contrôles UI (boutons, switches, sliders) utilisent des événements pour déclencher des actions dans le code-behind.
- Accès direct aux éléments UI : Le code-behind peut directement accéder aux éléments nommés (via
x:Name) pour appliquer des animations. - Logique métier dans le code-behind : Toute la logique (état de rotation, calcul d'angles, gestion de vitesse) est implémentée directement dans le code-behind ou éventuellement dans une classe de service dédiée.
Architecture simplifiée
Dans cette approche, le flux d'exécution est direct :
- L'utilisateur interagit avec un contrôle UI (par exemple, active un Switch).
- Un gestionnaire d'événements dans le code-behind est déclenché.
- Le gestionnaire met à jour l'état de l'application et déclenche les animations nécessaires.
- Les méthodes d'animation .NET MAUI sont appelées directement sur les éléments UI :
box.RotateTo(angle).
Exemple pas à pas : Animation d'un BoxView
Suivons maintenant un exemple concret en nous basant sur le code fourni.
Étape 1 : Création de la Vue XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiAnimationDemo.Views.AnimatePage"
Title="Animations MAUI avec Code-Behind">
<Grid Padding="20">
<VerticalStackLayout Spacing="10">
<!-- BoxView qui sera animé -->
<BoxView x:Name="box"
Margin="0,30,0,0"
Color="Aqua"
WidthRequest="150"
HeightRequest="150"
HorizontalOptions="Center" />
<!-- Switch de rotation -->
<HorizontalStackLayout HorizontalOptions="Center" Margin="0,25,0,0">
<Label x:Name="rotationLabel"
Text="Rotation inactive"
VerticalTextAlignment="Center" />
<Switch x:Name="rotationSwitch"
Toggled="OnRotationToggled" />
</HorizontalStackLayout>
<!-- Déplacement avec les boutons -->
<HorizontalStackLayout HorizontalOptions="Center" Margin="0,25,0,0">
<Button Text="<<"
Clicked="OnMoveLeft" />
<Button Text=">>"
Margin="10,0,0,0"
Clicked="OnMoveRight" />
</HorizontalStackLayout>
<!-- Ajustement de la vitesse -->
<StackLayout Orientation="Horizontal" HorizontalOptions="Center">
<Label x:Name="speedLabel"
Text="Speed 10" />
<Slider x:Name="speedSlider"
WidthRequest="150"
Value="10"
Minimum="1"
Maximum="50"
ValueChanged="OnSpeedChanged" />
</StackLayout>
</VerticalStackLayout>
</Grid>
</ContentPage>Étape 2 : Création du Code-Behind
namespace MauiAnimationDemo.Views
{
public partial class AnimatePage : ContentPage
{
// Variables d'état
private double _currentX = 0;
private int _currentAngle = 0;
private bool _isRotating = false;
private int _speed = 10;
public AnimatePage()
{
InitializeComponent();
// Démarrer la tâche de rotation en arrière-plan
StartRotationTask();
}
// Gestionnaire d'événement pour le changement d'état du Switch
private void OnRotationToggled(object sender, ToggledEventArgs e)
{
_isRotating = e.Value;
rotationLabel.Text = e.Value ? "Rotation active" : "Rotation inactive";
}
// Gestionnaire d'événement pour le bouton de déplacement vers la gauche
private async void OnMoveLeft(object sender, EventArgs e)
{
_currentX -= 50; // Déplacement de 50 pixels vers la gauche
await box.TranslateTo(_currentX, 0, 250, Easing.SpringOut);
}
// Gestionnaire d'événement pour le bouton de déplacement vers la droite
private async void OnMoveRight(object sender, EventArgs e)
{
_currentX += 50; // Déplacement de 50 pixels vers la droite
await box.TranslateTo(_currentX, 0, 250, Easing.SpringOut);
}
// Gestionnaire d'événement pour le changement de valeur du Slider
private void OnSpeedChanged(object sender, ValueChangedEventArgs e)
{
_speed = (int)e.NewValue;
speedLabel.Text = $"Speed {_speed}";
}
// Tâche en arrière-plan pour gérer la rotation continue
private async void StartRotationTask()
{
while (true)
{
if (_isRotating)
{
_currentAngle = (_currentAngle + _speed) % 360;
await box.RotateTo(_currentAngle, 0); // Rotation sans animation (instantanée)
}
// Attendre pour contrôler la fréquence des mises à jour
await Task.Delay(50);
}
}
}
}Explication détaillée de l'exemple
Animations
Vue (AnimatePage.xaml) : Définit la structure de l'interface utilisateur, y compris le BoxView à animer et les contrôles pour déclencher les animations (boutons, switch, slider). Chaque contrôle interactif est nommé avec
x:Nameet possède des gestionnaires d'événements.Code-behind (AnimatePage.xaml.cs) : Contient toute la logique de l'application :
- Les variables d'état (
_currentX,_currentAngle,_isRotating,_speed) - Les gestionnaires d'événements pour répondre aux interactions utilisateur
- La logique d'animation et les appels aux méthodes d'animation .NET MAUI
- La tâche en arrière-plan pour la rotation continue
- Les variables d'état (
Gestion des événements
La communication entre l'interface utilisateur et la logique se fait via des événements standard :
Événement Toggled : Déclenché lorsque l'utilisateur active ou désactive le Switch. Le gestionnaire
OnRotationToggledmet à jour l'état_isRotatinget le texte du Label.Événements Clicked : Déclenchés lorsque l'utilisateur clique sur les boutons de déplacement. Les gestionnaires
OnMoveLeftetOnMoveRightcalculent la nouvelle position et appliquent l'animation de translation.Événement ValueChanged : Déclenché lorsque l'utilisateur ajuste le Slider. Le gestionnaire
OnSpeedChangedmet à jour la vitesse et le texte du Label.
Types d'animations implémentés
Dans cet exemple, nous avons implémenté deux types d'animations :
Rotation (RotateTo) : Le BoxView tourne en fonction de la valeur de l'angle fournie par le ViewModel.
- Contrôlée par un Switch qui active/désactive la rotation continue.
- La vitesse de rotation est ajustable via un Slider.
Translation (TranslateTo) : Le BoxView se déplace horizontalement en réponse aux boutons de direction.
- Les boutons "<<" et ">>" déplacent le BoxView vers la gauche ou la droite.
- L'animation utilise un effet d'élasticité (
Easing.SpringOut) pour un rendu plus naturel.
Résumé des concepts clés
Gestionnaires d'événements : Les interactions utilisateur déclenchent des événements standard (Toggled, Clicked, ValueChanged) qui sont traités par des méthodes dans le code-behind.
Accès direct aux éléments UI : Le code-behind accède directement aux éléments nommés (via
x:Name) pour appliquer les animations et mettre à jour l'interface.Animation continue : Utilisation d'une tâche en arrière-plan (
StartRotationTask) pour créer une animation continue (rotation) basée sur un état booléen et un paramètre de vitesse.Animation ponctuelle : Déclenchement d'animations à la demande (déplacement) en réponse aux clics sur les boutons.
Méthodes d'animation .NET MAUI : Utilisation des méthodes d'extension d'animation intégrées (
RotateTo,TranslateTo) qui retournent desTasket peuvent être utilisées avecasync/await.