
🎯 学什么:用 Python 代码逐帧绘制动画 GIF——不是从网上找 GIF,而是用代码一帧一帧算出画面。核心洞察两条:(1) Slack 对 GIF 有严格的平台限制(128×128、≤ 3 秒、≤ 3MB),超出限制直接无法上传——优化策略不是追求最高质量,而是最小体积;(2)
linear匀速缓动是「默认陷阱」——自然界中没有任何东西是匀速运动的,linear 让动画看起来生硬、像机器人。 💡 难易度:⭐⭐⭐ | ⏱️ 预计时间:40 分钟
1. 课程概览
💡 白话小课堂:小时候都玩过翻页动画——在一本小本子的每一页画一张稍微不同的画,快速翻动时人物就「动」起来了。Slack GIF Creator 就是用代码来做翻页动画:你给每一帧写代码画出画面,然后所有帧串起来变成 GIF。三段式流程:起名字(创建画布)→ 画画(逐帧绘制)→ 装订成书(组装为 GIF 文件)。
来源:Anthropic 官方 Skills 仓库
2. Slack 平台约束
2.1 严格的限制
Slack 对 GIF 的限制不是「建议」,是硬约束——超出无法上传:
尺寸:
Emoji GIF:128×128(推荐)
消息 GIF:480×480
参数:
FPS:10-30(越低文件越小)
颜色数:48-128(越少文件越小)
时长:Emoji GIF ≤ 3 秒
文件大小:≤ 3MB(最重要!超过直接拒绝上传)
关键认知:
优化目标不是最高画质,是最小体积。
128×128 的画布上,width=1 的线在手机屏幕上几乎看不见——
始终用 width=2 或以上。
2.2 GIF 优化策略(按优先级)
优化策略从先到后:
1. 减少帧数(降 FPS 或缩短时长)——影响最小
→ 30 FPS → 15 FPS,人眼几乎看不出差异
2. 减少颜色数(128 → 64 → 48)——影响中等
→ 简单图形 48 色足够,照片级才需要 128+
3. 缩小尺寸(480 → 128)——影响最大
→ 这是最后手段,尺寸对文件大小影响最大但也最影响观看效果
4. 移除重复帧——零质量损失
→ 相邻帧完全相同的只保留一帧
5. Emoji 模式自动优化
3. 缓动函数库
3.1 为什么 linear 是「默认陷阱」
linear(匀速)的问题:
→ AI 最容易默认生成(不需要配置)
→ 但自然界中没有任何东西是匀速运动的:
- 小球下落:重力加速度(越来越快)
- 弹簧回弹:先快后慢(能量衰减)
- 心跳:有节奏的加速减速
→ 观众不会主动说「这是匀速的」,但会直觉觉得「生硬/不自然/像机器人」
正确的缓动选择:
| 缓动函数 | 效果 | 适合场景 |
|---------|------|---------|
| ease_in | 慢→快(加速) | 下落、进入画面 |
| ease_out | 快→慢(减速) | 停止、降落 |
| ease_in_out | 慢→快→慢 | 平滑运动、UI 过渡 |
| bounce_out | 弹跳衰减 | 物体落地弹跳 |
| elastic_out | 弹性过冲后归位 | 弹出通知、强调 |
| back_out | 先过冲再归位 | 吸引注意力的弹出 |
| spring() | 物理弹簧模拟 | 自然弹性效果 |
3.2 7 种基本动画概念
动画概念 = 舞蹈的基本动作——单独看每个都不复杂,但组合起来无限可能:
1. 抖动(Shake)—— 快速来回振荡
2. 脉冲(Pulse)—— scale 放大缩小(心跳感)
3. 弹跳(Bounce)—— 落地弹起衰减
4. 旋转(Rotate)—— 持续角度变化
5. 淡入淡出(Fade)—— 透明度渐变
6. 滑动(Slide)—— 从一边进入/退出
7. 缩放(Scale)—— 从小变大或从大变小
组合示例:
→ 脉冲 + 弹跳 = 一颗在蹦跳的心
→ 抖动 + 旋转 = 快被震散的小机器人
→ 淡入 + 滑动 = 一句慢慢浮现的话
4. 结构拆解:动画生成型 Skill 模板
动画生成型 Skill 模板
核心特征
→ 管理对象 = 程序化生成的动画 GIF → 核心原则 = 平台约束优先 + 缓动函数驱动自然运动 → 关键设计 = 三段式流程 + 优化策略链 + 动画概念组合
通用结构
Platform Constraints(平台约束)
尺寸/时长/FPS/颜色数/文件大小限制 优化目标:最小体积而非最高画质
Easing Functions(缓动函数库)
禁止 linear —— 永远不用匀速 7 种基本动画概念 × N 种缓动函数 = 无限组合
Three-Step Workflow(三段式流程)
- 创建画布(GIFBuilder + 尺寸)
- 逐帧绘制(代码画每一帧)
- 组装导出(帧序列 → GIF 文件 + 验证)
5. 电商案例:大促实时 GMV 战绩播报动图
某抖音直播代运营团队(同时运营 3 个品牌直播间:美妆/服饰/母婴)在 618 大促期间,需要在钉钉群里每 2 小时播报一次各直播间的实时累计 GMV 数据——让不在直播现场的团队(供应链、客服、设计)同步感知大促节奏。
用 slack-gif-creator 生成一个 128×128 的 Emoji GIF 动态战绩图,直接贴在钉钉群消息中。
设计方案:
- 画布:128×128 Emoji GIF(钉钉兼容 Slack 格式)
- 时长:3 秒(30 帧,10 FPS——平衡流畅度和文件体积)
- 主题:GMV 数字滚动 + 进度环 + 品牌色标识
- 动画组合:(1) 脉冲——GMV 数字每 1.5 秒一个呼吸脉冲(scale 0.95→1.05→0.95),模拟「数字在跳动」的实时感;(2) 旋转——外圈进度环持续旋转(顺时针 360°/3 秒),表示「还在直播中」;(3) 颜色渐变——背景色从深灰逐渐过渡到品牌主色(每帧色相微移),传达「GMV 在逼近目标」
- 缓动:脉冲用 spring(damping=15, stiffness=150),旋转用 linear(环的匀速旋转是少数适合 linear 的场景),背景色过渡用 ease_in_out
- 颜色:美妆品牌用 #E8618C(玫瑰粉),服饰品牌用 #1E40AF(品牌蓝),母婴品牌用 #F59E0B(暖金),颜色数限制 64 色
代码核心逻辑:
total_frames = 30
for i in range(total_frames):
t = i / (total_frames - 1)
# 进度环旋转(持续旋转表示还在直播)
ring_angle = t * 360 # 完整一圈
# GMV 数字脉冲(每 15 帧一个呼吸周期)
pulse_phase = (i % 15) / 14 # 0→1 的锯齿波
scale = 1.0 + 0.05 * sin(pulse_phase * 2 * pi)
# 背景色过渡(从深灰渐变到品牌色,暗示逼近目标)
bg_r = lerp(30, brand_r, t)
bg_g = lerp(30, brand_g, t)
bg_b = lerp(30, brand_b, t)
draw_progress_ring(ring_angle)
draw_scaled_text("¥128.6万", scale) # GMV 数字
draw_background(bg_r, bg_g, bg_b)
效果:
- 文件体积 1.4MB(在 3MB 限制内)
- 钉钉群里每条 GIF 战绩播报的平均消息可见确认(已读)率达 92%,远高于纯文字播报的 67%
- 大促期间,设计团队在看到 GIF 中的 GMV 即将破 150 万时,主动赶制了一张「突破 150 万」庆祝海报——实时动图创造了「战报就在眼前展开」的沉浸感
🔑 启示:大促战绩播报不应该是 Excel 截图——数据可视化动图利用「动的东西会抓住注意力」这个生理本能,在消息洪流的大促群聊里确保战绩被看到。三个动画概念(脉冲+旋转+渐变)各司其职:脉冲暗示实时性、旋转暗示进行中、渐变暗示逼近目标。
6. 掌握检验
Q1:Slack Emoji GIF 的标准推荐尺寸和时长约束是什么?
- A) 480×480,最长 10 秒
- B) 128×128,最长 3 秒
- C) 256×256,最长 5 秒
- D) 64×64,最长 1 秒
Q2:以下关于 width=1 线条的说法,哪个是正确的?
- A) width=1 的线条在 128×128 画布上看起来最精细专业
- B) width=1 的线条在手机屏幕上的 Slack 中几乎不可见,看起来粗糙且业余
- C) width=1 和 width=2 在 128×128 画布上没有肉眼可见的区别
- D) width=1 的线条只在黑色背景下有问题
Q3:动画概念组合是本 Skill 的精髓。请设计一个「新消息通知」Emoji GIF:要求至少组合 2 种动画概念,说明每种概念用在哪里,以及为什么选择这种组合。
Q4:为什么 linear(匀速)缓动函数被课程称为「默认陷阱」?在自然界中找到一个匀速运动的例子。
Q5:以下哪项 GIF 优化策略的顺序是正确的(从最先尝试到最后手段)?
- A) 缩小尺寸 → 减少颜色 → 减少帧数
- B) 减少帧数 → 减少颜色 → 缩小尺寸 → 移除重复帧 → Emoji 模式
- C) 移除重复帧 → 缩小尺寸 → 减少帧数
- D) Emoji 模式 → 减少颜色 → 减少帧数
Q6:Slack GIF Creator 提供什么和不提供什么?为什么「不提供预制动画模板」是一个有意的设计选择?
Q7:请用 Python 伪代码描述一个「弹跳+旋转」组合动画的核心逻辑:对象从画布上方掉落(弹跳),同时自身在旋转。
7. 答案
点击查看答案
Q1:B — 128×128(推荐)、最长 3 秒。Slack 对 Emoji GIF 有严格的大小限制(通常不超过 3MB)。
Q2:B — 在 128×128 的小画布上,1 像素的线极细,在手机屏幕上打开 Slack 时人眼几乎无法辨别。课程建议始终设置 width=2 或以上。
Q3:参考答案 — 动画概念组合:脉冲 + 弹性过冲。脉冲用于信封图标——scale 从 0.8 → 1.2 → 1.0(使用 spring() 物理弹簧)模拟「有人发消息」的提醒节奏;弹性过冲用于「NEW」文字标签——从透明 fadeIn 到 opacity 1.2,再回落到 1.0(back_out 实现略微过冲然后归位),制造「弹出来」的视觉效果。
Q4:参考答案 — 「默认陷阱」是因为 linear 不需要任何配置,AI 最容易默认生成。但自然界中没有匀速运动——小球下落是加速的(重力),弹簧回弹是先快后慢的。观众会直觉感到「这个动画有点奇怪/生硬/不自然/像机器人」。
Q5:B — 按照「最先尝试→最后手段」:减少帧数 → 减少颜色数 → 缩小尺寸 → 移除重复帧 → Emoji 模式自动优化。
Q6:参考答案 — 提供的:(1) 知识:Slack 平台要求和动画概念指导;(2) 工具:GIFBuilder、验证器、缓动函数库。不提供的:预制动画模板。不提供预制模板是有意的设计——核心理念是「给你工具和知识,创意由你发挥」。如果提供了 20 个模板,用户会用完模板就停止创造。
Q7:参考答案 — 下落用 ease_in(重力加速度),弹起用 bounce_out(弹跳衰减),旋转用 ease_in_out(持续平滑)。关键:y 位置和旋转角度是独立计算的两个维度——y 负责弹跳,angle 负责旋转,互不干扰。
(5/7 通过)
8. 延伸阅读
- [[L5-09-Skill创建器|上一课:元技能]]
- [[L5-11-企业内部沟通|下一课:企业内部沟通模板]]

评论区
共 0 条评论