Sistema di animazione avanzato per creare animazioni dinamiche, procedurali e basate su espressioni oltre i semplici fotogrammi chiave.
Il sistema di animazione supporta diversi tipi oltre ai tradizionali fotogrammi chiave:
Queste animazioni avanzate sono definite nella proprietà array animations degli elementi.
Animazioni dei Nodi (array animations):
Fotogrammi Chiave (array keyframes):
Quando più metodi di animazione mirano alla stessa proprietà:
| Proprietà | Tipo | Richiesto | Esempio | Intervallo di valori | Descrizione |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | Il tipo di animazione. |
| enabled | boolean | false | - | - | Se l'animazione è attiva. |
| target | string | true | - | - | Il percorso della proprietà da animare (ad es., "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Tempo di inizio dell'animazione relativo all'inizio dell'elemento, in secondi. |
| duration | number | false | - | - | Durata dell'animazione in secondi. Per animazioni cicliche, questo è il periodo del ciclo. |
| loop | boolean | false | - | - | Se l'animazione è ciclica. |
| blendMode | string | false | - | replace | add | multiply | Come questa animazione si combina con altre: sostituire (sovrascrivere), aggiungere (somma), moltiplicare (scala). |
| blendWeight | number | false | - | - | La forza/influenza di questa animazione (0-1). Utilizzato per fondere più animazioni. |
Le espressioni sono codice JavaScript valutato per ogni fotogramma, con accesso alle variabili di contesto dell'animazione.
{
time: number; // Tempo assoluto attuale (secondi)
localTime: number; // Tempo relativo all'inizio dell'elemento
duration: number; // Durata dell'elemento
progress: number; // Progresso normalizzato (0-1)
index: number; // Indice dell'elemento nel gruppo
total: number; // Numero totale di elementi nel gruppo
fps: number; // Fotogrammi al secondo
width: number; // Larghezza del canvas
height: number; // Altezza del canvas
value: any; // Valore della proprietà corrente
}Animazione di rimbalzo utilizzando funzioni 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
}
]
}
Combina più effetti:
{
"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
}
]
}
Modelli di animazione integrati con parametri configurabili.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Animazioni basate su passaggi che cambiano valori a intervalli specifici.
| Proprietà | Tipo | Richiesto | Esempio | Intervallo di valori | Descrizione |
|---|---|---|---|---|---|
| values | array | true | - | - | Array di valori da attraversare. |
| stepDuration | number | true | - | - | Durata di ciascun passaggio in secondi. |
| loop | boolean | false | - | - | Se far ripetere la sequenza. |
Testo che cicla attraverso diverse dimensioni:
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Animare gli elementi lungo percorsi di curve di Bezier.
| Proprietà | Tipo | Richiesto | Esempio | Intervallo di valori | Descrizione |
|---|---|---|---|---|---|
| path | string | array | true | - | - | Dati del percorso SVG (attributo d) o array di punti del percorso. |
| autoRotate | boolean | false | - | - | Se ruotare automaticamente l'elemento per seguire la tangente del percorso. |
| duration | number | true | - | - | Tempo per completare l'intero percorso. |
Movimento circolare:
{
"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 proprietà target utilizza la notazione a punti per specificare proprietà annidate:
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // Posizione x dell'elemento
"target": "scaleX" // Scala orizzontale
"target": "alpha" // Opacità
"target": "fill.color" // Colore di riempimento (se fill è un oggetto)
"target": "points[0].x" // Coordinata x del primo punto
}Controlla come le animazioni si combinano quando più mirano alla stessa proprietà:
{
"blendMode": "replace",
"blendWeight": 1.0
}Sostituisce completamente il valore della proprietà.
{
"blendMode": "add",
"blendWeight": 0.5
}Aggiunge al valore esistente (pesato). Utile per accumulare offset.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Moltiplica il valore esistente. Utile per effetti di scaling.
Combinare diversi tipi di animazione:
{
"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 }
}
]
}
In questo esempio:
startTime e duration sono relativi al tempo start dell'elementolocalTime nelle espressioni inizia a 0 quando l'elemento iniziaduration complessivo dell'elementoenabled: truetarget esiste sull'elementostartTime è all'interno della durata dell'elemento{
"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))"
}