Figma 设计稿转移动端代码:我踩过的坑和最终方案

17 阅读8分钟

前言

每个移动端开发者都经历过这个场景:设计师丢来一个 Figma 链接,你打开看了看,叹口气,开始对着设计稿一个像素一个像素地写 UI 代码。

一个中等复杂的页面——带导航栏、列表、卡片、底部按钮——手写 Compose 或 XML 布局,至少要半天。如果算上间距微调、主题适配、深色模式,一天都打不住。

我一直在想:这件事能不能自动化?

不是那种"截个图让 AI 猜"的方式,而是真正理解设计稿的结构,生成能直接用的代码。

折腾了几个月,踩了不少坑,最后做出了一个开源工具叫 figma-to-mobile。今天把过程中的思考和技术细节分享出来。

现有方案我都试过了

在动手之前,我把市面上能找到的方案都试了一遍:

方案一:Figma 插件(Locofy、Anima、TeleportHQ)

这类工具的思路是:装一个 Figma 插件,选中图层,直接导出代码。

优点:  开箱即用,不需要配置。

问题:

  • 导出的代码大量使用绝对定位absoluteOffsetposition: absolute),完全不是移动端的写法
  • 不理解 Auto Layout 的语义——Figma 里明明是个 Column,导出来却是一堆写死坐标的 Box
  • 付费,而且不便宜(Locofy Pro 要 $25/月)
  • 导出后几乎无法迭代,改一点设计就要重新导出

方案二:截图给 AI(GPT-4V、Claude Vision)

最近很火的思路:截个图,丢给多模态 AI,让它生成代码。

优点:  简单粗暴,什么设计工具都行。

问题:

  • AI 只能"看"到像素,猜不出布局结构。一个 8 行的列表,AI 可能给你写 8 个独立的 Row,而不是一个 LazyColumn
  • 颜色靠猜,经常偏色(#333333 和 #2C2C2C 肉眼看不出,但代码里不一样)
  • 间距靠猜,误差大
  • 完全没有主题信息(Material3 Color Scheme、Typography)
  • 没有组件状态信息(按钮的 pressed/disabled 状态?不知道)

方案三:手写

最靠谱但最慢。好处是代码质量完全可控,坏处是——太慢了。

我的思路:直接读 Figma 的设计树

上面三种方案的核心问题是:信息丢失

  • 插件导出丢失了布局语义
  • 截图丢失了所有结构信息
  • 手写没有丢失信息,但你自己就是"解析器"

Figma 其实有完整的 REST API,可以拿到一个节点的完整设计树:

  • 每个节点的类型(FRAME、TEXT、INSTANCE、VECTOR)
  • Auto Layout 参数(方向、间距、对齐、padding)
  • 填充色、描边、圆角、阴影
  • 文字属性(字体、字号、行高、颜色)
  • 组件实例信息(指向哪个 Component,当前 Variant 属性)

这些信息足够生成高质量的布局代码。

关键洞察:与其让 AI 从像素猜结构,不如把结构直接喂给 AI,让它做翻译。

技术实现

整个工具分三步:提取 → 解释 → 生成

第一步:从 Figma API 提取设计数据

写了一个 Python 脚本(figma_fetch.py),输入 Figma 链接,输出精简后的设计树 JSON。

# 解析 Figma URL,提取 file_key 和 node_id
# GET /v1/files/{file_key}/nodes?ids={node_id}
# 返回完整节点树,包括子节点、样式、Auto Layout 参数

Figma API 返回的原始数据非常冗余(一个中等页面可能有 2MB JSON),所以做了大量精简:

  • 去掉不可见节点(visible: false
  • 合并纯装饰节点(只有背景色的空 Frame)
  • 将 RGBA 浮点色值转为 #RRGGBB 十六进制
  • 提取阴影、渐变等效果信息
  • 保留组件实例的 Variant 属性(关键!)

精简后的数据通常只有原始数据的 10-20%,但保留了所有布局和样式信息。

第二步:AI 解释设计语义

这是最关键的一步。拿到设计树后,AI 需要理解"这些节点组合在一起是什么意思"。

举几个例子:

Figma 结构正确理解错误理解
6 个结构相似的纵向子节点LazyColumn + item 模板6 个独立的 Column
INSTANCE 节点带 State=Pressed按钮有多种状态,需要 selector只是一个普通按钮
横向排列、itemSpacing=8Row(Arrangement.spacedBy(8.dp))手动加 Spacer
padding: 16/16/16/16Modifier.padding(16.dp)分别写四个方向

为此写了一套映射规则(compose-patterns.mdxml-patterns.md 等),告诉 AI:

"当你看到 layoutMode: VERTICAL + itemSpacing: X,输出 Column(verticalArrangement = Arrangement.spacedBy(X.dp))"

"当你看到 3 个以上结构相似的子节点,考虑使用 LazyColumn / RecyclerView 而不是逐个写死"

第三步:生成平台代码

目前支持四个平台:

平台特点
Jetpack ComposeMaterial3 主题系统,最完善
Android XMLConstraintLayout/LinearLayout,兼容旧项目
SwiftUIVStack/HStack/ZStack,适配 iOS
UIKitAutoLayout 约束,适配旧 iOS 项目

每个平台有独立的 patterns 文件,定义了 Figma 属性到目标代码的映射规则。AI 根据这些规则生成代码,而不是自由发挥。

这很重要 —— 不限制 AI 的话,它可能生成能跑但不符合团队规范的代码。有了 patterns,输出质量稳定得多。

踩过的坑

坑 1:INSTANCE 节点是金矿

Figma 里的 INSTANCE 节点代表"组件实例",它指向一个可复用的 Component。

一开始我忽略了这个信息,把所有节点一视同仁地转成代码。结果:一个页面里用了同一个 Button 组件 5 次,生成了 5 段几乎一模一样的代码。

正确做法:  识别出 INSTANCE 节点,提取它的 componentId 和 variantProperties,生成一个可复用的 Composable/View,然后复用。

坑 2:Variant 属性对应组件状态

Figma 的 Component Variants 是个强大的功能。设计师会创建 Button 组件,然后定义变体:

State: Default / Pressed / Disabled
Size: Small / Medium / Large

这些 Variant 属性直接映射到代码里的状态和参数。如果忽略它们,生成的代码只有"默认状态",交互效果全丢。

坑 3:Figma 的 px 不等于 Android 的 px

Figma 里的单位是 CSS px(1:1 对应 dp),不是 Android 的物理 px。这意味着:

  • Figma 16px → Compose 16.dp(不是 16.px)
  • Figma 字号 14px → Compose 14.sp

看起来简单,但如果搞错了,整个页面的尺寸都会偏。

坑 4:Auto Layout ≠ 绝对定位

Figma 支持两种布局:Auto Layout(自适应)和自由定位(手动拖拽)。

很多插件把自由定位的节点也导出成绝对坐标,在移动端完全不可用。我的做法是:

  • Auto Layout 节点 → 映射到 Column/Row/LazyColumn
  • 自由定位节点 → 用 Box + Modifier.offset() + 警告提示

并且在输出里告诉用户:"这个节点使用了绝对定位,建议在 Figma 里改成 Auto Layout 以获得更好的代码质量。"

坑 5:设计稿里的"装饰性"节点

设计师喜欢用空的 Frame 做间距、背景分隔、装饰效果。这些节点在设计稿里有意义,但转成代码就是垃圾——一堆什么都不做的空 Box。

解决方案:在提取阶段就过滤掉"只有背景色、没有子节点、没有文字"的叶子节点,或者合并到父节点的 padding/background 里。

效果对比

用一个 Material Design 3 的消息应用设计稿做测试:

指标截图给 AIFigma 插件导出figma-to-mobile
布局结构正确❌ 大量绝对定位❌ 绝对定位✅ Column/Row/LazyColumn
颜色准确⚠️ 靠猜,有偏差✅ 准确✅ 准确
间距准确❌ 误差大✅ 准确✅ 准确
Material3 主题❌ 没有❌ 没有✅ 有
组件复用❌ 重复代码❌ 重复代码✅ 提取复用
可以迭代❌ 重新截图❌ 重新导出✅ 自然语言修改

不是银弹

说几个这个工具做不到的事,免得大家期望太高:

  1. 不能处理复杂插画/图标——Figma 里的 Vector 节点(SVG 路径)目前只标记为"需要导出为图片资源",不会转成代码绘制
  2. 需要设计稿规范——如果设计师完全不用 Auto Layout,全靠手动拖拽定位,输出质量会大打折扣
  3. 不能替代开发者——生成的代码是"80% 完成度"的起点,剩下 20%(业务逻辑、数据绑定、动画)还是要自己写
  4. 依赖 AI 的理解能力——AI 偶尔会对复杂嵌套结构产生误判,需要人工审查

但 80% 的重复工作被自动化了,这已经是巨大的提效。

怎么用

工具是 AI Agent Skill 的形式,支持主流 AI 编程助手:

# OpenClaw(一键安装)
clawhub install figma-to-mobile

# Claude Code / GitHub Copilot
# 复制 figma-to-mobile 文件夹到项目的 skills 目录

ClawHub 页面:clawhub.ai/timeaground…

设好 Figma Token 后,在 AI 助手对话框里直接说:

把这个设计转成 Jetpack Compose:www.figma.com/design/xxx/…

AI 会自动拉取设计数据、分析结构、生成代码。不满意可以继续用自然语言修改:

"把顶部导航栏改成 sticky" "配色换成深色模式" "列表项加上点击波纹效果"

完全开源,MIT 协议,免费使用。

GitHub: github.com/TimeAground…


如果觉得有用,欢迎 ⭐ Star 支持。有问题或建议可以提 Issue,我会积极回复。

也欢迎关注我的 X(Twitter):@timeaground,会持续分享开发者工具和 AI 效率方面的内容。