Sistema de animação avançado para criar animações dinâmicas, procedurais e baseadas em expressões além de simples quadros-chave.
O sistema de animação suporta vários tipos além dos quadros-chave tradicionais:
Essas animações avançadas são definidas na propriedade de array animations dos elementos.
Animações de Nó (animations array):
Quadros-Chave (keyframes array):
Quando vários métodos de animação visam a mesma propriedade:
| Propriedade | Tipo | Necessário | Exemplo | Faixa de Valores | Descrição |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | O tipo de animação. |
| enabled | boolean | false | - | - | Se a animação está ativa. |
| target | string | true | - | - | O caminho da propriedade a animar (ex: "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Hora de início da animação relativa ao início do elemento, em segundos. |
| duration | number | false | - | - | Duração da animação em segundos. Para animações em loop, este é o período do loop. |
| loop | boolean | false | - | - | Se a animação faz loop. |
| blendMode | string | false | - | replace | add | multiply | Como esta animação se combina com outras: substituir (sobrescrever), adicionar (soma), multiplicar (escala). |
| blendWeight | number | false | - | - | A força/influência desta animação (0-1). Usado para misturar múltiplas animações. |
Expressões são códigos JavaScript avaliados por quadro, com acesso a variáveis de contexto de animação.
{
time: number; // Tempo absoluto atual (segundos)
localTime: number; // Tempo relativo ao início do elemento
duration: number; // Duração do elemento
progress: number; // Progresso normalizado (0-1)
index: number; // Índice do elemento no grupo
total: number; // Total de elementos no grupo
fps: number; // Quadros por segundo
width: number; // Largura do canvas
height: number; // Altura do canvas
value: any; // Valor atual da propriedade
}Animação de salto usando funções 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
}
]
}
Combine múltiplos efeitos:
{
"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
}
]
}
Padrões de animação integrados com parâmetros configuráveis.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Animações baseadas em etapas que mudam valores em intervalos específicos.
| Propriedade | Tipo | Necessário | Exemplo | Faixa de Valores | Descrição |
|---|---|---|---|---|---|
| values | array | true | - | - | Array de valores para percorrer. |
| stepDuration | number | true | - | - | Duração de cada etapa em segundos. |
| loop | boolean | false | - | - | Se deve repetir a sequência. |
Texto alternando entre tamanhos diferentes:
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Anime elementos ao longo de caminhos de curvas Bezier.
| Propriedade | Tipo | Necessário | Exemplo | Faixa de Valores | Descrição |
|---|---|---|---|---|---|
| path | string | array | true | - | - | Dados do caminho SVG (atributo d) ou array de pontos do caminho. |
| autoRotate | boolean | false | - | - | Se deve rotacionar automaticamente o elemento para seguir a tangente do caminho. |
| duration | number | true | - | - | Tempo para completar todo o caminho. |
Movimento circular:
{
"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
}
]
}
A propriedade target utiliza notação de ponto para especificar propriedades aninhadas:
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // Posição x do elemento
"target": "scaleX" // Escala horizontal
"target": "alpha" // Opacidade
"target": "fill.color" // Cor de preenchimento (se o preenchimento for um objeto)
"target": "points[0].x" // Coordenada x do primeiro ponto
}Controle como as animações se combinam quando várias visam a mesma propriedade:
{
"blendMode": "replace",
"blendWeight": 1.0
}Substitui completamente o valor da propriedade.
{
"blendMode": "add",
"blendWeight": 0.5
}Adiciona ao valor existente (ponderado). Útil para acumular deslocamentos.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Multiplica o valor existente. Útil para efeitos de escala.
Combinando diferentes tipos de animação:
{
"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 }
}
]
}
Neste exemplo:
startTime e duration são relativos ao tempo de start do elementolocalTime em expressões começa em 0 quando o elemento iniciaduration geral do elementoenabled: truetarget existe no elementostartTime está dentro da duração do 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))"
}