动效

UI 形变动画设计

一支14秒的纯代码短片:同一个形状依次形变为播放器、标签页和命令面板,每次变化都由120 BPM下的光标触发。

OpenDesign代码改编与制作
官方
UI 形变动画设计14s · 动效
一张黑色音乐播放器卡片,带有渐变专辑块、进度条和播放图标。
动效设计中的一帧

适用场景

  • 产品动效预告片设计无需在画面间切换,就能展示多个界面状态的短循环。
  • 微交互展示片把开关、滑块、标签页和命令面板演示成一个连贯故事的序列。
  • 音乐同步界面动画光标动作落在固定节拍网格上的作品。

动效亮点

  • 从不切镜的单一形状每个状态都是同一个容器的形变,而不是场景切换。
  • 由光标引发的变化每一次转场都始于一个可见的指针动作。
  • 首尾闭合的循环最后一帧与第一帧一致,因此播放时可以无缝重复。

一个形状如何撑起整支短片

短片时长14秒,节奏为120 BPM,源文档将其划分为7小节。一个形状从“Generate”按钮开始,依次变为加载器、对勾、灵动岛、音乐播放器、音量滑块、开关、标签指示器、图表、命令面板和提示条,最后回到按钮。

代价是每个状态都必须能通过调整同一主体的尺寸和圆角,从上一个状态到达。无法适应这种形状变化的内容,只能舍弃或重新设计。

节拍图阶段及各阶段展示的内容
阶段可见变化设计含义
按钮到加载器再到对勾“Generate”按钮变为进度状态,随后变为确认状态。请求、等待和结果被读作一个对象,而不是三个界面。
灵动岛到音乐播放器紧凑的胶囊展开为深色卡片,带有专辑块、标题、进度条和播放控制。从胶囊到卡片的扩展表明,同一个容器可以同时承载概览状态和详情状态。
滑块、开关、标签页音量滑块被拉伸超过最大值,随后是开关和 Day / Week / Month 标签胶囊。小型控件沿用同一套圆角语言,因此变化更多体现在动效上,而不是样式上。
图表、命令面板、提示条图表自行绘制,命令面板输入“frame”,提示条收束循环。最密集的状态放在后段,此时观众已经理解了这个形状的逻辑。

解读播放器、标签页和命令面板画面

三个截取的画面展示了同一个形状可以多么不同。在播放器中,黑色圆角卡片承载渐变块、“motion study 02”、位于0:49且剩余−2:09的进度条,以及上一首、播放和下一首图标。在标签页画面中,白色胶囊容纳 Day、Week 和 Month,Day 后面有一个黑色指示器。

在命令面板中,输入的单词“frame”带出两条结果:“Frame rate · 60fps”和“Every frame is code”,第一条高亮显示。

音乐播放器状态:已播放和剩余时间位于进度条下方,光标正靠近控制按钮。
音乐播放器状态:已播放和剩余时间位于进度条下方,光标正靠近控制按钮。

清晰易读的播放状态

已播放和剩余时间标签位于进度条下方。它们是14秒短片内的示意性界面内容,并非展示视频本身的时长。将播放器改编到较小画布时,请保持这两个标签清晰可读。

标签指示器是一个运动的对象

黑色的 Day 胶囊位于白色轨道内,而光标悬停在 Month 上。由于指示器是独立的形状,它可以在标签之间滑动和拉伸,而不是简单切换高亮。

命令面板文字与短片呼应

结果“Frame rate · 60fps”和“Every frame is code”谈的正是作品本身。可以沿用这个思路,但请把文字替换成你自己的产品词汇。

时间驱动的构建方式及其取舍

源文档描述了一个单一的 render(t) 函数,它根据主时间轴时间绘制整个画面。每个可见数值都是 t 的纯函数,使用缓动、弹簧或关键帧,帧与帧之间不携带任何状态。因此向后拖动时间轴会重现完全相同的画面。

这让导出结果可预测,但对制作者要求更高。用事件处理很容易实现的交互,例如悬停或输入,必须改写成带时间的关键帧。

  1. 只保留一个时钟

    GSAP 主时间轴是唯一的时钟。各图层读取它的当前时间,而不是运行自己的计时器。

  2. 为每次变化叠加弹簧

    改编说明要求为每次变化叠加弹簧,让重叠的运动相互融合,而不是重新开始。

  3. 让光标引发一切

    每次状态变化之前都需要一个指针动作。没有这条规则,形变看起来就只是装饰,而不是交互。

来源与范围

这是 OpenDesign 官方对 @twoclipping 最初发布在 X 上的一件动效作品的代码重制与改编。它根据已发布的作品用代码重建,14秒的配乐是原创配乐,而非来自原作的音频。署名仅为事实性参考,并不意味着原作者的认可。

这是一项渲染出来的动效研究,而不是可用的界面产品。短片中的播放器、图表和命令面板不会响应输入。该模板来自一个拟议中的 OpenDesign 视频工作流;能否使用取决于所安装的版本。

将形变改编到你自己的产品

说明建议替换 SHAPE 定义中的各个状态及其内容,同时保留三条规则:从不切镜的单一形状、为每次变化叠加弹簧、每次变化背后都有光标。先列出你最需要展示的五个产品状态,再按容器从小到大排序。

如果想要循环,请让首尾状态保持一致。如果各状态的尺寸差异很大,过渡帧会显得被拉伸,请相应放慢节奏。

选择更少但更有力的状态

这支短片在14秒内展示了约十个状态。只有四个状态的产品预告片,可以让每个状态在画面上停留更久。

在一处统一换肤

文案、配色和时间设置为常量,位于参考代码的顶部,因此更换暖灰色画布或黑色组件只需小幅修改。

避免沉重的画布特效

说明提醒,大面积渐变和逐像素噪点会让每个截取的帧开销很大,从而拖慢 MP4 导出。

如何在 OpenDesign 中创建 UI 形变动画设计

  1. 下载并安装 OpenDesign

    下载桌面客户端并完成安装与初始配置,然后为您的设计创建一个项目。

    下载 OpenDesign
  2. 定义形状及其状态

    列出单个容器必须经历的各个状态,从紧凑的按钮到最大的形态。在动手绘制之前,先确定每次变化由哪个指针动作触发,并固定节奏。

    建议提示词

    创建一支14秒的循环 UI 动效短片,画布为1920x1080的暖浅灰色。使用一个黑白相间的圆角形状,全程不切镜。以120 BPM的节奏,将它从“Generate”按钮依次形变为加载器、对勾、带进度条的音乐播放器、Day / Week / Month 标签胶囊,以及一个会输入一个短词的命令面板。每一次变化都必须由可见的光标触发。让最后一帧与第一帧一致,以实现循环。只使用示例文字,不要添加真实数据或可用的控件。

  3. 一切由时间驱动

    要求每个可见数值都由时间轴时间计算得出,这样向后拖动时间轴也会得到完全相同的画面。将文案、配色和时间设置为常量,方便在一处统一修改。

  4. 检查声音、循环与节奏

    检查结尾帧是否等于起始帧,光标动作是否落在节拍上,以及内容密集的状态是否过于仓促。只使用你有权使用的音频,或保持短片无声。

  5. 导出并获取分享链接

    导出完成的设计稿,然后在 OpenDesign 中使用「Share」功能获取分享链接。在单独的浏览器窗口中打开链接,确认目标版本及其资源均可正常访问后,再将链接发送给他人。