Système d'animation avancé pour créer des animations dynamiques, procédurales et basées sur des expressions, au-delà des simples images clés.
Le système d'animation prend en charge plusieurs types au-delà des images clés traditionnelles :
Ces animations avancées sont définies dans la propriété animations du tableau des éléments.
Animations de Nœud (animations array) :
Images Clés (keyframes array) :
Lorsque plusieurs méthodes d'animation ciblent la même propriété :
| Propriété | Type | Requis | Exemple | Plage de valeurs | Description |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | Le type d'animation. |
| enabled | boolean | false | - | - | Que l'animation soit active. |
| target | string | true | - | - | Le chemin de propriété à animer (par exemple, "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Temps de début de l'animation par rapport au début de l'élément, en secondes. |
| duration | number | false | - | - | Durée de l'animation en secondes. Pour les animations en boucle, c'est la période de boucle. |
| loop | boolean | false | - | - | Que l'animation boucle. |
| blendMode | string | false | - | replace | add | multiply | Comment cette animation se combine avec d'autres : remplacer (remplacer), ajouter (somme), multiplier (échelle). |
| blendWeight | number | false | - | - | La force/l'influence de cette animation (0-1). Utilisé pour mélanger plusieurs animations. |
Les expressions sont du code JavaScript évalué par image, avec accès aux variables de contexte d'animation.
{
time: number; // Temps absolu actuel (secondes)
localTime: number; // Temps relatif au début de l'élément
duration: number; // Durée de l'élément
progress: number; // Progression normalisée (0-1)
index: number; // Index de l'élément dans le groupe
total: number; // Total des éléments dans le groupe
fps: number; // Images par seconde
width: number; // Largeur du canevas
height: number; // Hauteur du canevas
value: any; // Valeur actuelle de la propriété
}Animation de rebond utilisant des fonctions Math :
{
"id": "element-1",
"type": "Image",
"start": 0,
"duration": 5,
"animations": [
{
"type": "expression",
"target": "y",
"enabled": true,
"expression": "100 + Math.abs(Math.sin(localTime * 3)) * 200",
"startTime": 0,
"duration": 5,
"loop": true
}
]
}
Combiner plusieurs effets :
{
"animations": [
{
"type": "expression",
"target": "rotation",
"expression": "(localTime * 2 * Math.PI / duration) + Math.sin(localTime * 4) * 0.1",
"loop": true
},
{
"type": "expression",
"target": "scaleX",
"expression": "1 + Math.sin(localTime * 5) * 0.2",
"loop": true
}
]
}
Modèles d'animation intégrés avec des paramètres configurables.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Animations basées sur des étapes qui changent les valeurs à des intervalles spécifiques.
| Propriété | Type | Requis | Exemple | Plage de valeurs | Description |
|---|---|---|---|---|---|
| values | array | true | - | - | Tableau de valeurs à parcourir. |
| stepDuration | number | true | - | - | Durée de chaque étape en secondes. |
| loop | boolean | false | - | - | Que la séquence boucle. |
Texte alternant entre différentes tailles :
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Animer des éléments le long de chemins de courbe de Bézier.
| Propriété | Type | Requis | Exemple | Plage de valeurs | Description |
|---|---|---|---|---|---|
| path | string | array | true | - | - | Données de chemin SVG (attribut d) ou tableau de points de chemin. |
| autoRotate | boolean | false | - | - | Que l'élément soit automatiquement tourné pour suivre la tangente du chemin. |
| duration | number | true | - | - | Temps pour compléter l'ensemble du chemin. |
Mouvement circulaire :
{
"animations": [
{
"type": "path",
"target": "position",
"enabled": true,
"path": "M 100,100 a 200,200 0 1,1 0,1 Z",
"autoRotate": true,
"duration": 4,
"loop": true
}
]
}
La propriété target utilise la notation par point pour spécifier les propriétés imbriquées :
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // Position x de l'élément
"target": "scaleX" // Échelle horizontale
"target": "alpha" // Opacité
"target": "fill.color" // Couleur de remplissage (si le remplissage est un objet)
"target": "points[0].x" // Coordonnée x du premier point
}Contrôlez comment les animations se combinent lorsque plusieurs ciblent la même propriété :
{
"blendMode": "replace",
"blendWeight": 1.0
}Remplace complètement la valeur de la propriété.
{
"blendMode": "add",
"blendWeight": 0.5
}Ajoute à la valeur existante (pondérée). Utile pour accumuler des décalages.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Multiplie la valeur existante. Utile pour les effets de mise à l'échelle.
Combinaison de différents types d'animation :
{
"id": "animated-element",
"type": "Shape",
"animations": [
{
"type": "expression",
"target": "x",
"expression": "width / 2 + Math.sin(localTime * 2) * 300",
"blendMode": "replace",
"loop": true
},
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"frequency": 3,
"amplitude": 0.2,
"blendMode": "add",
"blendWeight": 0.5
},
{
"type": "sequence",
"target": "alpha",
"values": [1, 0.8, 1],
"stepDuration": 0.3,
"loop": true,
"blendMode": "multiply"
}
],
"keyframes": [
{
"id": "kf-1",
"time": 0,
"stateObj": { "scaleX": 1 }
},
{
"id": "kf-2",
"time": 2,
"stateObj": { "scaleX": 1.5 }
}
]
}
Dans cet exemple :
startTime et duration sont relatifs au temps de start de l'élémentlocalTime dans les expressions commence à 0 lorsque l'élément commenceduration globale de l'élémentenabled: truetarget existe sur l'élémentstartTime est dans la durée de l'élément{
"type": "expression",
"target": "x",
"expression": "value + (targetX - value) * 0.1"
}{
"type": "expression",
"target": "scaleY",
"expression": "1 + Math.exp(-localTime * 3) * Math.cos(localTime * 8) * 0.5"
}{
"type": "procedural",
"proceduralType": "wiggle",
"target": "x",
"frequency": 10,
"amplitude": 5
}{
"type": "expression",
"target": "alpha",
"expression": "Math.max(0, Math.min(1, (localTime - index * 0.1) * 2))"
}