Animações, keyframes e transições
1. Modelo de agendamento
Ciclo de vida de um clip de nível superior:
- Esperar até
start - Inserir o nó na cena
- Executar animações, keyframes e transições durante a janela ativa do clip
- Encerrar o ciclo de vida do clip
Comportamento em paralelo:
animationsekeyframespodem rodar em paralelo- A
transitionvisual também pode rodar em paralelo para clips que não sejamaudio - Clips
audioexecutam automação de áudio em vez de transições visuais
2. Animation
interface Animation {
type: AnimationType;
duration: number;
delay?: number;
easing?: EasingFunction;
loop?: boolean | number;
from?: any;
to?: any;
direction?: "left" | "right" | "up" | "down";
distance?: number;
}Tipos de animação atualmente suportados:
fadeInfadeOutmovescalerotateslideInslideOutzoomInzoomOut
3. Comportamento dos campos
duration
- Unidade: segundos
- Obrigatório
- Se
loopestiver ativado, um ciclo de loop ainda usa esse valor como duração base
delay
- Unidade: segundos
- Opcional
- Animações com o mesmo atraso começam juntas
- Animações com atrasos diferentes executam em seu próprio momento programado
easing
- Opcional
- O padrão é
linearquando omitido
loop
- Tipo:
boolean | number true: repetir o máximo possível dentro da duração restante do clip- Número: repetir por esse número de ciclos
- Se o tempo total de loop exceder a janela do clip, ele será truncado automaticamente
from
Atualmente relevante para:
scalerotatemove
Notas:
move.fromdeve ser{ x, y }scale.frompode ser um número ou um valor 2Drotate.fromdeve ser um número
to
Atualmente relevante para:
scalerotatemove
Notas:
move.todeve ser{ x, y }
direction
Atualmente usada por:
slideInslideOut
Alguns templates embutidos também passam direction para suas animações geradas.
distance
Atualmente usada por:
slideInslideOut
Padrão:
- Normalmente
200quando omitida
4. Comportamento por tipo de animação
fadeIn
- Começa com opacidade
0 - Anima até a opacidade original
fadeOut
- Anima da opacidade atual para
0
zoomIn
- Começa com escala
[0, 0] - Anima até a escala original
zoomOut
- Anima da escala atual para
[0, 0]
slideIn
- Começa deslocada por
direction + distance - Também faz fade in a partir de opacidade
0
slideOut
- Termina saindo usando
direction + distance - Também faz fade out até opacidade
0
scale
- Se
fromexistir, a escala é definida primeiro comofrom - Depois anima para
to - Se
toestiver ausente, retorna à escala original
rotate
- Se
fromexistir, a rotação é definida primeiro - Depois anima para
to - Se
toestiver ausente, normalmente gira até360
move
frometodevem ser ambos objetos- Exemplo:
{
"type": "move",
"duration": 1,
"from": { "x": -200, "y": 0 },
"to": { "x": 0, "y": 0 }
}5. keyframes
interface Keyframe {
property: string;
frames: KeyframeFrame[];
}
interface KeyframeFrame {
time: number;
value: any;
easing?: EasingFunction;
}Propriedades atualmente confirmadas como suportadas:
xypositionopacityscalerotationwidthheightfillstroke
Comportamento:
framessão ordenados portime- O primeiro frame define diretamente o valor inicial
- Frames posteriores interpolam entre pontos de controle
- Após o último keyframe, o clip espera até o seu próprio final
6. Transition
interface Transition {
type: "fade" | "slide" | "zoom" | "wipe";
duration: number;
direction?: "left" | "right" | "up" | "down";
easing?: EasingFunction;
}Atualmente suportada:
fadeslidezoomwipe
Comportamento em runtime:
- Cada transição tem uma fase de entrada e uma fase de saída
- Ambas as fases usam
transition.duration - Se o tempo combinado das transições exceder a duração do clip, o runtime o trunca automaticamente
7. Comportamento por tipo de transição
fade
- Entrada: opacidade
0 -> opacidade original - Saída: opacidade original
-> 0
slide
- Entrada: desliza de fora do canvas
- Saída: desliza para a direção selecionada
- A opacidade muda ao mesmo tempo
zoom
- Entrada: aumenta a escala e faz fade in
- Saída: reduz a escala e faz fade out
wipe
- Implementada aproximadamente por meio de escalonamento de eixos
- As direções esquerda e direita comprimem o eixo horizontal
- As direções cima e baixo comprimem o eixo vertical
8. Lista de easing
Atualmente suportada:
lineareaseInSineeaseOutSineeaseInOutSineeaseInQuadeaseOutQuadeaseInOutQuadeaseInCubiceaseOutCubiceaseInOutCubiceaseInQuarteaseOutQuarteaseInOutQuarteaseInBackeaseOutBackeaseInOutBackeaseInElasticeaseOutElasticeaseInOutElasticeaseInBounceeaseOutBounceeaseInOutBounce
9. Controle de tempo do áudio
Além de start e duration, clips audio também suportam:
source.startsource.endfadeInfadeOut
Juntos, eles controlam:
- quando a reprodução começa
- qual segmento da mídia de origem é usado
- como o volume muda ao longo do tempo
10. Exemplo: entrada, permanência e saída de um título
{
"type": "text",
"start": 0,
"duration": 4,
"text": "Hello",
"transform": {
"x": "50%",
"y": "50%"
},
"style": {
"fontSize": 72,
"fill": "#ffffff"
},
"animations": [
{
"type": "slideIn",
"direction": "up",
"distance": 120,
"duration": 0.6,
"easing": "easeOutCubic"
},
{
"type": "fadeOut",
"delay": 3.2,
"duration": 0.6,
"easing": "easeInSine"
}
],
"transition": {
"type": "fade",
"duration": 0.25
}
}