Hệ thống hoạt hình nâng cao để tạo ra các hoạt hình động, quy trình và dựa trên biểu thức vượt xa các keyframe đơn giản.
Hệ thống hoạt hình hỗ trợ một số loại ngoài các keyframe truyền thống:
Các hoạt hình nâng cao này được định nghĩa trong thuộc tính mảng animations của các phần tử.
Hoạt Hình Node (mảng animations):
Keyframes (mảng keyframes):
Khi nhiều phương pháp hoạt hình nhắm vào cùng một thuộc tính:
| Thuộc tính | Loại | Bắt buộc | Ví dụ | Phạm vi giá trị | Mô tả |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | Loại hoạt hình. |
| enabled | boolean | false | - | - | Liệu hoạt hình có đang hoạt động hay không. |
| target | string | true | - | - | Cú pháp thuộc tính để hoạt hình (ví dụ: "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Thời gian bắt đầu của hoạt hình tương đối với thời gian bắt đầu của phần tử, tính bằng giây. |
| duration | number | false | - | - | Thời gian của hoạt hình tính bằng giây. Đối với các hoạt hình lặp lại, đây là chu kỳ lặp lại. |
| loop | boolean | false | - | - | Liệu hoạt hình có lặp lại hay không. |
| blendMode | string | false | - | replace | add | multiply | Cách hoạt hình này kết hợp với các hoạt hình khác: thay thế (ghi đè), thêm (tổng), nhân (tỷ lệ). |
| blendWeight | number | false | - | - | Sức mạnh/ảnh hưởng của hoạt hình này (0-1). Được sử dụng để kết hợp nhiều hoạt hình. |
Các biểu thức là mã JavaScript được đánh giá theo từng khung hình, với quyền truy cập vào các biến ngữ cảnh hoạt hình.
{
time: number; // Thời gian tuyệt đối hiện tại (giây)
localTime: number; // Thời gian tương đối so với điểm bắt đầu của phần tử
duration: number; // Thời gian của phần tử
progress: number; // Tiến độ đã chuẩn hóa (0-1)
index: number; // Chỉ số phần tử trong nhóm
total: number; // Tổng số phần tử trong nhóm
fps: number; // Khung hình trên giây
width: number; // Chiều rộng của canvas
height: number; // Chiều cao của canvas
value: any; // Giá trị thuộc tính hiện tại
}Hoạt hình nảy sử dụng các hàm 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
}
]
}
Kết hợp nhiều hiệu ứng:
{
"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
}
]
}
Các mẫu hoạt hình tích hợp sẵn với các tham số có thể cấu hình.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Các hoạt hình theo bước thay đổi giá trị tại các khoảng thời gian cụ thể.
| Thuộc tính | Loại | Bắt buộc | Ví dụ | Phạm vi giá trị | Mô tả |
|---|---|---|---|---|---|
| values | array | true | - | - | Mảng các giá trị để bước qua. |
| stepDuration | number | true | - | - | Thời gian của mỗi bước tính bằng giây. |
| loop | boolean | false | - | - | Liệu có lặp lại chuỗi hay không. |
Văn bản chuyển đổi qua các kích thước khác nhau:
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Hoạt hình các phần tử dọc theo các đường cong Bezier.
| Thuộc tính | Loại | Bắt buộc | Ví dụ | Phạm vi giá trị | Mô tả |
|---|---|---|---|---|---|
| path | string | array | true | - | - | Dữ liệu đường dẫn SVG (thuộc tính d) hoặc mảng các điểm đường dẫn. |
| autoRotate | boolean | false | - | - | Liệu có tự động xoay phần tử theo tiếp tuyến của đường dẫn hay không. |
| duration | number | true | - | - | Thời gian để hoàn thành toàn bộ đường dẫn. |
Chuyển động tròn:
{
"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
}
]
}
Thuộc tính target sử dụng cú pháp dấu chấm để chỉ định các thuộc tính lồng nhau:
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // Vị trí x của phần tử
"target": "scaleX" // Tỷ lệ chiều ngang
"target": "alpha" // Độ mờ
"target": "fill.color" // Màu sắc fill (nếu fill là đối tượng)
"target": "points[0].x" // Tọa độ x của điểm đầu tiên
}Kiểm soát cách các hoạt hình kết hợp khi nhiều hoạt hình nhắm vào cùng một thuộc tính:
{
"blendMode": "replace",
"blendWeight": 1.0
}Hoàn toàn thay thế giá trị thuộc tính.
{
"blendMode": "add",
"blendWeight": 0.5
}Thêm vào giá trị hiện có (có trọng số). Hữu ích để tích lũy độ dịch chuyển.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Nhân với giá trị hiện có. Hữu ích cho các hiệu ứng tỷ lệ.
Kết hợp các loại hoạt hình khác nhau:
{
"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 }
}
]
}
Trong ví dụ này:
startTime và duration là tương đối với thời gian start của phần tửlocalTime trong các biểu thức bắt đầu từ 0 khi phần tử bắt đầuduration tổng thể của phần tửenabled: truetarget tồn tại trên phần tửstartTime nằm trong khoảng thời gian của phần tử{
"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))"
}