FigmaExport:如何自动将UI-Kit从Figma导出到Xcode和Android Studio项目





如果您是iOS或Android开发人员,并且项目的设计是在Figma中开发的,则很可能在导出资源时遇到问题:无法卸载颜色,并且图标和图像不方便导出。在本文中,我将告诉您如何简化生活,以及如何将UI-Kit从Figma直接导出到Xcode和Android Studio。



越来越多的移动开发团队正在转向Figma。以前,许多人(而且我们也是)使用了一堆Sketch + Zeplin或Figma + Zeplin。而且很方便。但是,在其中一个项目中,我们增加了对黑暗主题的支持时,情况变得更糟。 Zeplin不支持深色主题,因此您必须寻找让您思考的变通办法:现在是否需要Zeplin?在这种情况下,Zeplin浪费了设计人员使用两种工具维护和同步项目的时间,以及公司的额外成本。



放弃Zeplin并搬到Figma之后,我们(开发人员)开始经历从Figma导出UI-Kit的痛苦。



与Zeplin不同,Figma不会以任何方式与Xcode或Android Studio进行交互。插件可防止Figma与它们紧密集成。我们找到了一个命令行实用程序,可以导出颜色和文本样式,但是它对我们不起作用-它不支持导出图像和深色主题。这就是为什么我编写实用程序的原因。



但是关于这些问题的更多细节。



为什么移动开发人员从Figma导出资产不方便



问题#1:无法导出颜色



当我们在Figma中打开UI-Kit时,开发人员会看到什么?在最简单的情况下,是几个不同颜色的圆圈。







但是,如果项目很大并且支持深色主题,则调色板将包含更多颜色:



计划添加深色主题支持?看看调色板可以变大多少






Figma无法导出颜色。您最多只能选择颜色并复制十六进制值。而且,如果设计人员更改了某些内容,那么在使用大调色板的情况下,开发人员将不得不花费大量时间来比较代码和Figma中的调色板。



颜色名称也不总是很适合复制。某些设计人员在样式名称中使用“ /”字符,但iOS和Android不支持该字符。需要使用此符号将颜色分组。







例。 Figma中的颜色称为background / primary。对于Android开发人员,您需要指定一种名为background_primary的颜色,对于iOS开发人员,则需要指定backgroundPrimary



颜色的另一个问题是深色主题。没有任何设计器工具(Figma,Zeplin,Sketch)都允许您同时具有深色和浅色调色板。这里有两种方法:使用深色调色板创建一个单独的文件,或将所有颜色存储在一个文件中,但使用后缀来命名它们,例如,background_primary_day,background_primary_night。



作为开发人员,我们想要的是能够将Figma的调色板直接导出到Xcode或Android Studio项目。



问题2:使用标准工具不方便导出图标



这里也有几个困难。



同样,设计人员会在图标名称中使用“ /”字符对图标进行分组。例如,如果使用标准的Figma工具导出名称为ic / 24 / tab / profile的图标,则将获得此类嵌套。







这是不可能的。我必须重命名该文件。该文件应命名为ic24TabProfile.pdf。这是针对iOS开发人员的。



对于Android开发人员来说,通常以snake_case样式命名资源。在这种情况下,该文件将被命名为ic_24_tab_profile.xml。但是Figma并没有这样做。



从Figma导出的图标将必须手动传输到项目中。对于iOS开发人员来说,仅迁移它们是不够的。必须为每个图标放下:保存矢量数据,单一比例,渲染为模板图像。







作为开发人员,我们想要的是能够将所有Figma图标直接导出到Xcode或Android Studio项目。



问题3:使用标准工具不方便导出插图





图标是小的矢量图像,通常是黑白图像,可以(由系统或开发人员)重新着色并调整大小。如果启用辅助功能,则一些图标会随文本一起增长。他们的主要问题是名称:上面提到的“ /”字符,以及iOS开发人员使用camelCase名称,而Android开发人员使用snake_case的事实。







插图是大型彩色图像,在深色和浅色主题中有所不同。在深色主题中,应将颜色静音。如果插图太浅,则在黑暗中站立时,眼睛会被明亮的光线“击中”。









插图与图标有相同的问题,但也有一些新的问题。



Android开发人员将Figma图标和插图导出为SVG文件,然后使用Android Studio的内置工具将SVG文件转换为矢量可绘制XML文件。如果您需要导出50个图标或插图,则需要很长时间才能将它们全部转换。这可以是自动化的。



iOS开发人员将插图导出为三种比例的位图。如果应用程序支持深色主题,则总共将有6张图像。这就是在iOS项目中的样子:







现在,让我们想象一下,我们已经从Figma卸载了50个插图。事实证明,我们有50 * 6 = 300个PNG图像,必须通过拖放将它们手动传输到项目,然后再次将它们全部手动重命名。您要这样做吗? -不还有更多重要的事情要做...



作为开发人员,我们想要的是能够将所有Figma插图直接导出到Xcode或Android Studio项目。



为什么Zeplin没有帮助:



  • 它不支持深色主题;
  • 不允许您使用具有相同十六进制值但名称不同的几种颜色:如果根据应用场合对颜色进行命名,则可能会发现两种颜色将具有不同的名称,但具有相同的十六进制值。例如,backgroundPrimaryPressed(按下时为前景色)和backgroundSecondary(背景色)必须具有相同的十六进制值。Zeplin不允许您这样做。有一种解决方法-将HEX值更改为最低值。示例#F4F5F8和#F4F5F7;
  • 需要额外的设计人员资源来使布局和UI套件与Figma同步;
  • 它要花额外的钱。Figma每个组织每个设计师每月的费用为12美元。如果您购买Zeplin,则每位设计师每月还需要10.75美元;




我们如何自动化Figma的资产出口



意识到不再像这样生活的时候,我看了看Figma是否具有任何API或具有通过插件扩展以自动导出的功能,事实证明确实如此。我有两条路径:编写一个Figma插件或使用Figma API



Figma插件可直接在Figma应用程序中使用。使用Figma API,您可以编写控制台实用程序。该插件不仅可以从Figma文件中读取信息,还可以对其进行更改。因此,Figma插件要求开发人员具有编辑文件的权限。Figma API只能从Figma文件中读取信息。



该插件是用JavaScript编写的。使用Figma API,您可以编写任何内容的包装。但是Figma插件不能与开发人员(用户)计算机上的文件系统一起使用。这就是为什么我没有这样做。



我是iOS开发人员,因此我决定在Swift中制作一个控制台实用程序。我从一个原型开始,该原型应该将Figma的调色板直接导出到Xcode项目。几周后,一切就绪。是的 我运行了实用程序,几秒钟后,我在Xcode中获得了整个调色板。这就是完美的Figma导出工作的方式:)







几个月后,我准备从Figma导出资产的实用程序准备就绪。您可以在文章末尾找到它的链接。



出口流程如何运作



色彩



开发人员调用该命令figma-export colors如果是iOS项目,则将颜色导出到Assets.xcassets文件夹



此外,还将创建一个Color.swift文件以便您可以直接从代码中使用颜色。

import UIKit
 
 extension UIColor {
    static var backgroundSecondaryError: UIColor { return UIColor(named: #function)! }
    static var backgroundSecondarySuccess: UIColor { return UIColor(named: #function)! }
    static var backgroundVideo: UIColor { return UIColor(named: #function)! }
    ...
 }


如果它是一个Android项目,那么如果支持深色主题,则将颜色导出到values / colors.xmlvalues-night / colors.xml中



值/ colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="button">#7701FF</color>
    <color name="button_ripple">#8A80FF</color>
    <color name="button_disabled">#D9DCE1</color>

    <color name="text_primary">#FFFFFC</color>
    <color name="text_primary_pressed">#A680FE</color>
    <color name="text_primary_disabled">#FFFFFE</color>
    <color name="text_secondary">#101828</color>
    <color name="text_tertiary">#A5ACBD</color>
...




值晚上/ colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="button">#6F01EC</color>
    <color name="button_ripple">#7D6AF0</color>
    <color name="button_disabled">#3F334B</color>

    <color name="text_primary">#E6D9F6</color>
    <color name="text_primary_pressed">#E6D9F3</color>
    <color name="text_primary_disabled">#544761</color>
    <color name="text_secondary">#E6D9F5</color>
    <color name="text_tertiary">#7B6F98</color>
...




图示





开发人员调用命令。 如果这是一个iOS项目,则图标将作为带有“作为模板图像渲染”参数的PDF文件导出Assets.xcassets文件夹如果在UITabBar中使用图标,则可以选择指定“保留矢量数据”以支持辅助功能。 如果它是一个Android项目,则图标将作为矢量xml文件导出到drawable文件夹。在内部,该实用程序使用Android Studio使用的官方vd工具(vector-drawable-tool)将SVG文件转换为XML。figma-export icons.

















插图



开发人员调用的命令 将是相同的,只是将图片导出为PNG文件。 如果是Android项目,则插图将作为矢量xml文件导出到drawable和drawable-night文件夹。figma-export images.



















如何配置导出



FigmaExport有很多设置,这些设置存储在配置文件中,并在实用程序启动时通过。

./figma-export colors -i figma-export.yaml



配置文件指定iOS,Android和常规参数的参数。它还包含Figma文件的标识符,其中包含颜色,图标和图片。如果在浏览器中打开文件ID,则可以在地址栏中找到它。

例如,以下是我们的UI-Kit的地址:www.figma.com/file/GVHjNNE8PKKRf1KtnMPY9m/RTC-Key-UI-kit我们



这里的lightFileId文件的标识符:GVHjNNE8PKKRf1KtnMPY9m



iOS项目的配置文件示例:



---
figma:
  lightFileId: shPilWnVdJfo10YFo12345
  darkFileId: KfF6DnJTWHGZzC9Nm12345
ios:
  # Path to the Assets.xcassets directory
  xcassetsPath: "./Resources/Assets.xcassets"
  
  # Parameters for exporting colors
  colors:
    # Should be generate color assets instead of pure swift code 
    useColorAssets: True
    # Name of the folder inside Assets.xcassets where to place colors (.colorset directories)
    assetsFolder: Colors
    # Path to Color.swift file where to export colors for accessing colors from the code (e.g. UIColor.backgroundPrimary)
    colorSwift: "./Sources/Presentation/Common/Color.swift"
    # Color name style: camelCase or snake_case
    nameStyle: camelCase

  # Parameters for exporting icons
  icons:
    # Name of the folder inside Assets.xcassets where to place icons (.imageset directories)
    assetsFolder: Icons
    # Icon name style: camelCase or snake_case
    nameStyle: camelCase
    # [optional] Enable Preserve Vector Data for specified icons
    preservesVectorRepresentation:
    - ic24TabMain
    - ic24TabHistory
    - ic24TabProfile

  # Parameters for exporting images
  images:
      # Name of the folder inside Assets.xcassets where to place images (.imageset directories)
      assetsFolder: Illustrations
      # Image name style: camelCase or snake_case
      nameStyle: camelCase




Android项目的配置文件示例:



---
figma:
  lightFileId: shPilWnVdJfo10YFo12345
  darkFileId: KfF6DnJTWHGZzC9Nm12345
android:
  mainRes: "./main/res"




如何组织一个Figma文件来自动导出资源



为了自动卸载UI-Kit,必须遵守以下规则。



一般



  • 如果颜色,图标或插图在iOS或Android的属性中是唯一的,则说明字段必须包含“ ios”“ android”如果颜色,图标或插图不可用于导出,则其description属性将为“ none”因此,FigmaExport将确定应将哪些内容导出到iOS项目,什么是Android项目以及什么都不应导出。


例。共享图标在iOS和Android上看起来有所不同。下面的屏幕快照表明ic24ShareIos图标将仅导出到iOS项目。在“组件描述”属性中指定ios,并且ic24ShareAndroid图标将仅导出到Android项目;





  • 图标和插图应该是组件。
  • 颜色样式和组件必须在团队库中发布。
  • 仅导出添加到“图标和插图”框架中的图标和插图。




示例





带有UI-Kit的Figma文件(浅色主题)






带有UI-Kit的Figma文件(深色主题)




资源名称



可以将颜色,图标和插图称为包含字母az,AZ和符号“ _”和“ /”的任何名称。



由于代码中的变量名称不能带有“ /”符号,因此FigmaExport会自动将其替换为“ _”符号。然后,结果字符串将转换为iOS的camelCaseAndroid的snake_case

颜色名称 的iOS 安卓系统
按钮/按下 buttonPressed button_pressed
背景/ primaryPressed backgroundPrimaryPressed background_primary_pressed


图标名称 的iOS 安卓系统
ic / 24 / sound_off

ic24SoundOff

ic_24_sound_off


插图标题 的iOS 安卓系统
img /演示/ camera_archive

imgDemoCameraArchive

img_demo_camera_archive



为了保持一致和方便起见,您可以例如以自己的格式命名所有图标-ic / size / name一个示例是ic / 24 / open插图是img / group / title一个示例是img / zero / nointernet。您可以在文章“应用程序设计器:如何创建和转移深色主题”中阅读有关颜色的信息



在配置文件figma-export.yaml中,可以使用正则表达式在导出之前启用名称验证。如果任何资源名称错误,FigmaExport将报告它。


common:
 colors:
   # RegExp pattern for color name validation before exporting
   nameValidateRegexp: '^[a-zA-Z_]+$' # RegExp pattern for: background, background_primary, widget_primary_background
 icons:
   # RegExp pattern for icon name validation before exporting
   nameValidateRegexp: '^(ic)_(\d\d)_([a-z0-9_]+)$' # RegExp pattern for: ic_24_icon_name, ic_24_icon
 images:
   # RegExp pattern for image name validation before exporting
   nameValidateRegexp: '^(img)_([a-z0-9_]+)$' # RegExp pattern for: img_image_name




黑暗主题



如果您的项目支持深色主题,则需要使用UI组件创建一个单独的文件,其中将包含深色调色板和深色插图。



颜色

在Figma文件中,必须将颜色设置为颜色样式并发布到团队库中。





为了方便开发人员,建议制作一张所有颜色的表格,以指明使用哪种颜色以及在哪里使用。





图标

Figma文件必须具有一个名为Icons的框架。此框架应包含每个图标的组件。示例:





插图

Figma文件应具有一个名为“插图”的框架,其中包含每个插图的组件。例:







结果



多亏了FigmaExport,我们在使用Figma时摆脱了很多问题。现在,导出资源只需几秒钟。使用该实用程序使我们的生活更轻松的一些示例。



1.其中一个项目有52个图标。设计师认为,所有这些元素都必须具有相同的风格。他更新了它们之后,我们不得不在家中对其进行更新。



我们将如何手动更新它们:将Figma中的所有图标导出为zip文件,重命名52个文件,将图标传输到项目,设置所有必要的属性,确保它们没有忘记任何内容。这至少需要一个小时。



我们如何从FigmaExport更新它们:我们运行了figma-export icons命令10秒钟后,所有更改都收紧了,我们在模拟器上启动了该应用程序,并看到所有图标都被替换了。



2.在其中一个冲刺中,我们决定发布一个新功能。在UI-Kit中,设计人员添加了四个新图标,删除了两个旧图标,并添加了两种新颜色。



与其花一个小时的时间与设计师讨论他在UI-Kit中所做的更改,手动导出图标和颜色,我们仅运行了figma-export colorsfigma-export icons命令,并且通过Git,我们看到了删除,添加的内容以及什么改变了。他们立即开始使用新的图标和颜色来编排布局。



3.我们提供了一项功能,其中有必要对扩展版进行扩展,包括4个部分,每个部分最多包含7页的图片。







手动导出将花费很长时间。不到一分钟的时间内执行了figma-export images命令后,我们将所有这些图像放入项目中,可以使用了。







缺点少



  • 必须与设计者就如何在UI-Kit中存储颜色,图标,图片达成一致,以便可以自动卸载它们。
  • 导出仅适用于添加到团队库中的那些组件,因此设计者必须具有付费的Figma订阅。




计划:

  • 添加了导出文本样式的功能,
  • 添加了为Android导出位图图像的功能,
  • 添加SwiftUI支持。


特别感谢Artur Abrarov和Katya Rokityan帮助完成了UI-Kit。



实用程序链接



在GitHub上下载FigmaExport



如果您尝试使用我的工具,我会很高兴。问题,希望,反馈-写信给我d.subbotin@redmadrobot.com



All Articles