Fortgeschrittenes Animationssystem zur Erstellung dynamischer, prozeduraler und ausdrucksbasierter Animationen, die über einfache Keyframes hinausgehen.
Das Animationssystem unterstützt mehrere Typen über traditionelle Keyframes hinaus:
Diese fortgeschrittenen Animationen werden im animations Array-Attribut von Elementen definiert.
Knotenanimationen (animations Array):
Keyframes (keyframes Array):
Wenn mehrere Animationsmethoden dasselbe Attribut anvisieren:
| Eigenschaft | Typ | Erforderlich | Beispiel | Wertbereich | Beschreibung |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | Der Typ der Animation. |
| enabled | boolean | false | - | - | Ob die Animation aktiv ist. |
| target | string | true | - | - | Der Eigenschaftspfad, der animiert werden soll (z. B. "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Startzeit der Animation relativ zum Elementstart, in Sekunden. |
| duration | number | false | - | - | Dauer der Animation in Sekunden. Bei sich wiederholenden Animationen ist dies die Schleifenperiode. |
| loop | boolean | false | - | - | Ob die Animation in einer Schleife ausgeführt wird. |
| blendMode | string | false | - | replace | add | multiply | Wie diese Animation mit anderen kombiniert wird: ersetzen (überschreiben), hinzufügen (summe), multiplizieren (skalieren). |
| blendWeight | number | false | - | - | Die Stärke/Einfluss dieser Animation (0-1). Wird zum Mischen mehrerer Animationen verwendet. |
Ausdrücke sind JavaScript-Code, der pro Frame ausgewertet wird und Zugriff auf Animationskontextvariablen hat.
{
time: number; // Aktuelle absolute Zeit (Sekunden)
localTime: number; // Zeit relativ zum Elementstart
duration: number; // Elementdauer
progress: number; // Normalisierter Fortschritt (0-1)
index: number; // Elementindex in der Gruppe
total: number; // Gesamte Elemente in der Gruppe
fps: number; // Bilder pro Sekunde
width: number; // Canvas-Breite
height: number; // Canvas-Höhe
value: any; // Aktueller Eigenschaftswert
}Bounce-Animation unter Verwendung von Math-Funktionen:
{
"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
}
]
}
Kombinieren Sie mehrere Effekte:
{
"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
}
]
}
Eingebaute Animationsmuster mit konfigurierbaren Parametern.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Schrittbasierte Animationen, die Werte in bestimmten Intervallen ändern.
| Eigenschaft | Typ | Erforderlich | Beispiel | Wertbereich | Beschreibung |
|---|---|---|---|---|---|
| values | array | true | - | - | Array von Werten, durch die geschritten werden soll. |
| stepDuration | number | true | - | - | Dauer jedes Schrittes in Sekunden. |
| loop | boolean | false | - | - | Ob die Sequenz in einer Schleife ausgeführt wird. |
Text, der durch verschiedene Größen wechselt:
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Animation von Elementen entlang von Bezier-Kurvenpfaden.
| Eigenschaft | Typ | Erforderlich | Beispiel | Wertbereich | Beschreibung |
|---|---|---|---|---|---|
| path | string | array | true | - | - | SVG-Pfaddaten (d-Attribut) oder Array von Pfunkten. |
| autoRotate | boolean | false | - | - | Ob das Element automatisch gedreht wird, um dem Pfadtangenten zu folgen. |
| duration | number | true | - | - | Zeit, um den gesamten Pfad abzuschließen. |
Kreisbewegung:
{
"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
}
]
}
Das target-Attribut verwendet die Punktnotation, um geschachtelte Eigenschaften anzugeben:
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // x-Position des Elements
"target": "scaleX" // Horizontale Skalierung
"target": "alpha" // Opazität
"target": "fill.color" // Füllfarbe (wenn fill ein Objekt ist)
"target": "points[0].x" // x-Koordinate des ersten Punktes
}Steuern, wie Animationen kombiniert werden, wenn mehrere dasselbe Attribut anvisieren:
{
"blendMode": "replace",
"blendWeight": 1.0
}Ersetzt den Eigenschaftswert vollständig.
{
"blendMode": "add",
"blendWeight": 0.5
}Fügt den bestehenden Wert hinzu (gewichtet). Nützlich zum Ansammeln von Offset.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Multipliziert den bestehenden Wert. Nützlich für Skalierungseffekte.
Kombinieren verschiedener Animationstypen:
{
"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 diesem Beispiel:
startTime und duration sind relativ zur start-Zeit des ElementslocalTime in Ausdrücken beginnt bei 0, wenn das Element beginntduration des Elementsenabled: truetarget-Eigenschaft existiert am ElementstartTime liegt innerhalb der Dauer des Elements{
"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))"
}