
界面绘制这件事很多人第一反应是打开Axure、Figma或者Visio但如果你是一个长期跟代码打交道的开发者尤其是做嵌入式、C语言或者底层工具链的你会发现那些重型工具反而拖慢节奏。draw.io现在叫diagrams.net是我用了快六年的工具它最大的好处是免费、跨平台、文件格式开放而且能直接嵌入到各种文档工作流里。这篇内容围绕“用draw.io来绘制界面”这个主题展开结合raylib、XML解析、C语言这些关键词聊聊怎么把界面草图和代码实现之间的链路打通。不管你是刚接触界面设计的新手还是想找一个轻量级方案替代重型工具的老手下面的内容都能直接拿去用。1. 为什么界面草图阶段我最终选了draw.io1.1 从“画个框”到“能交付的界面文档”之间的鸿沟很多人画界面草图就是拿纸笔或者随便找个在线白板画几个矩形标注一下“这里是按钮”“这里是输入框”然后丢给开发就完事了。这种做法在小项目里勉强能用但一旦界面元素超过二十个或者需要多人协作评审问题就暴露了标注不统一、尺寸没概念、交互状态缺失、版本管理混乱。我见过最离谱的一次一个设置页面的草图改了七版每版都是微信截图传来传去最后开发拿到的版本和设计最新的版本差了三个迭代。draw.io解决的正是这个“从随手画到可交付”的断层。它本质上是一个基于XML的矢量绘图工具每个图形元素都有明确的坐标、尺寸、样式属性导出格式支持PNG、SVG、PDF还能直接生成XML源文件。这意味着你的界面草图不再是“一张图”而是一份结构化的文档。你可以用Git管理它可以diff对比两个版本的差异甚至可以用脚本批量修改某些属性。这一点对于习惯用代码思维管理一切的开发者来说非常友好。1.2 draw.io和raylib、easyx、sdl这些图形库的配合逻辑热词里出现了raylib、easyx、sdl这三个都是C/C领域常用的图形库。raylib偏向游戏开发和多媒体应用easyx是Windows平台下针对C语言初学者的图形库sdl则是跨平台的底层多媒体库。用draw.io画界面和这些库有什么关系关系在于当你用raylib或者sdl做一个带UI的程序时你需要先确定每个控件的布局坐标、层级关系、状态切换逻辑而draw.io恰好可以充当这个“布局规划器”。具体来说你可以用draw.io画出目标界面的线框图然后给每个控件标注上在代码中对应的变量名、坐标范围、事件响应函数。比如一个按钮你在draw.io里给它命名btn_start标注x120, y340, w160, h48然后在C代码里直接照着这个数值初始化。这样做的好处是界面调整时你只需要改draw.io里的坐标再同步到代码里而不是在代码里反复试错。我自己的习惯是draw.io文件里用一个单独的图层放“坐标标注”导出时隐藏这个图层这样评审时看到的是干净的界面开发时打开图层就能看到所有数值。1.3 免费、离线、XML开放格式带来的长期收益draw.io最被低估的一点是它的文件格式。它保存的.drawio文件本质上就是XML结构清晰可读性不差。这意味着你可以用任何文本编辑器打开它可以用Python脚本解析它可以用XSLT转换它。热词里有人问“xml文件怎么打开和编辑”draw.io文件就是一个很好的XML实践案例。你甚至可以用C语言写一个简单的解析器把draw.io里的图形元素提取出来自动生成raylib的初始化代码。虽然这个链路听起来有点绕但在需要批量生成界面代码的场景下这种自动化能省掉大量重复劳动。另外draw.io有桌面版完全离线可用。对于做嵌入式开发或者内网环境的人来说这一点比什么在线协作都重要。你不需要担心网络问题不需要担心服务停运文件永远在你自己的硬盘上。2. 用draw.io画界面的核心操作链路2.1 从空白画布到第一版线框图的完整步骤打开draw.io之后第一件事是选模板。我建议直接选“空白图表”不要用那些花哨的UI模板因为模板自带的样式往往需要大量修改才能用反而浪费时间。新建之后先在右侧面板把网格打开设置网格大小为10px这样画出来的元素坐标都是整数方便后续在代码里使用。接下来是画布尺寸的设定。如果你是为raylib或者sdl做界面先确定目标分辨率比如800x600或者1280x720。在draw.io里你可以通过“文件-页面设置”把画布尺寸设成一样的值。然后从左侧图形库里拖一个矩形出来作为界面的背景框尺寸设成和画布一致填充色设为浅灰边框设为无。这个背景框的作用是给你一个视觉边界避免画着画着元素跑到画布外面去了。然后开始放主要区域。以一个小工具界面为例顶部放标题栏高度60px左侧放导航栏宽度200px中间是内容区底部放状态栏高度40px。每个区域用矩形表示填充不同的浅色以便区分。这一步不需要精确先把大块分区定下来。我自己的经验是分区阶段用不同颜色标注比用文字标注更直观评审的时候一眼就能看出布局比例是否合理。2.2 控件库的建立与复用别每次都从头画按钮draw.io支持自定义图形库这是它比很多在线工具强的地方。你可以把常用的按钮、输入框、下拉菜单、复选框画好一组然后保存成自定义库。下次新建界面时直接从自定义库里拖出来用尺寸和样式都是统一的。具体操作是先画一个标准按钮设置好圆角、填充色、边框色、字体大小然后选中它点击“文件-新建库”把它拖进去。重复这个过程把输入框、标签、图标占位符都加进去。之后每次画新界面左侧图形库面板里就会多出你自定义的类别。这个习惯我坚持了三年现在画一个中等复杂度的界面十分钟就能出第一版线框图因为大部分控件都是拖出来改改文字就行。还有一个技巧是使用“样式模板”。draw.io允许你把当前选中图形的样式设为默认样式之后新建的同类图形都会沿用这个样式。比如你把按钮的样式调好之后右键选择“设为默认样式”下次画按钮就不用再调一遍了。2.3 图层管理把标注、交互状态和最终视觉分开draw.io的图层功能很多人没用起来但它对界面绘制特别有用。我的做法是至少分三个图层第一个图层叫“布局”放所有控件的最终位置和尺寸第二个图层叫“标注”放坐标数值、变量名、事件说明第三个图层叫“状态”放按钮的hover态、按下态、禁用态等变体。这样分的好处是导出给不同角色看的时候只需要切换图层可见性。给产品经理看只开“布局”层给开发看开“布局”和“标注”层给测试看三个层都开。而且修改的时候不会互相干扰比如你要调整按钮位置只需要在“布局”层操作标注层的文字不会跟着乱跑。图层的另一个用途是做版本对比。你可以把旧版本的布局放在一个单独图层里降低透明度和新版本叠加对比一眼就能看出哪些元素移动了、哪些尺寸变了。这个技巧在做界面迭代的时候特别省事。3. 把draw.io的XML结构吃透从画图到代码的桥梁3.1 draw.io文件里到底存了什么前面说了draw.io文件本质是XML但具体结构是什么样的我拿一个最简单的按钮来举例。当你画一个矩形并设置文字为“开始”时XML里对应的mxCell节点大概长这样mxCell idbtn_start value开始 stylerounded1;fillColor#4A90D9;fontColor#FFFFFF;fontSize14; vertex1 parent1 mxGeometry x120 y340 width160 height48 asgeometry/ /mxCell这里面有几个关键属性id是你自己可以改的我习惯直接写成代码里对应的变量名value是显示的文字style里包含所有视觉属性mxGeometry里的x、y、width、height就是坐标和尺寸。如果你在代码里需要这些数值完全可以用脚本把这个XML解析出来生成一个头文件或者配置数组。热词里有人问“c语言json解析”其实XML解析在C语言里也有成熟的库比如libxml2或者expat。如果你不想引入第三方库对于draw.io这种结构相对固定的XML自己写一个简单的字符串扫描函数也能提取出需要的属性值。当然前提是你对XML的结构足够熟悉。3.2 用脚本把界面元素坐标导出成C语言数组我实际做过一个流程用Python解析draw.io文件把每个带特定前缀的图形元素的坐标和尺寸提取出来生成一个C语言的结构体数组。这个数组可以直接被raylib或者sdl的界面初始化代码使用。具体步骤是这样的第一步在draw.io里给所有需要导出的控件加上统一的前缀比如ui_。第二步用Python的xml.etree.ElementTree解析文件遍历所有mxCell节点筛选出id以ui_开头的元素。第三步提取mxGeometry里的x、y、width、height以及value里的文字。第四步按照C语言结构体的格式输出。生成的代码大概是这样typedef struct { const char *name; int x, y, w, h; const char *label; } UIElement; UIElement ui_elements[] { {ui_btn_start, 120, 340, 160, 48, 开始}, {ui_btn_stop, 300, 340, 160, 48, 停止}, {ui_label_title, 20, 10, 200, 30, 控制面板}, };这个数组可以直接在raylib的绘制循环里遍历使用。每次界面调整只需要在draw.io里改坐标重新跑一遍脚本代码就同步了。这个流程我用了两年多省掉了大量手动改坐标的时间。3.3 XML解析时容易踩的坑命名空间和转义字符自己写解析脚本的时候有两个坑几乎一定会遇到。第一个是命名空间。draw.io的XML根节点通常带有xmlns属性如果你用标准的XML解析库它会自动处理命名空间但如果你用字符串匹配的方式就要注意标签名可能带有前缀。我的建议是直接用成熟的XML解析库不要自己写正则表达式去匹配因为XML的嵌套结构用正则处理很容易出错。第二个坑是转义字符。draw.io里的文字如果包含、、这些符号在XML里会被转义成amp;、lt;、gt;。解析出来之后需要做一次反转义。Python的xml.etree会自动处理这个问题但如果你用其他方式提取就要手动替换。我一开始没注意这个结果生成的代码里按钮文字变成了amp;排查了半天才发现是转义的问题。还有一个细节是draw.io的mxGeometry节点在相对定位和绝对定位下表现不同。如果你的图形有父节点坐标可能是相对于父节点的。所以在解析之前最好把所有图形都放在根节点下或者确保你理解层级关系。我自己的做法是所有需要导出的控件都直接放在根节点下不嵌套这样坐标就是绝对坐标解析起来最简单。4. 界面绘制中的实战经验与避坑指南4.1 坐标对齐为什么你的界面在代码里总是歪的用draw.io画界面时最常出现的问题是在工具里看着很整齐到了代码里运行出来却歪歪扭扭。原因通常有两个一是draw.io里的网格吸附没有开导致坐标不是整数二是代码里的坐标系和draw.io的坐标系原点位置不同。draw.io的原点在左上角x向右递增y向下递增这和大多数图形库包括raylib、sdl、easyx是一致的。但有些库或者框架的原点可能在左下角这时候就需要做y轴翻转。我的做法是在draw.io里始终开启网格吸附网格大小设为10px所有元素坐标都保证是10的倍数。然后在代码里先用一个简单的测试程序把几个矩形画出来对比draw.io里的位置确认坐标系一致之后再批量导入。这个验证步骤只需要五分钟但能避免后面大量的调试时间。还有一个对齐技巧是使用draw.io的“分布”功能。选中多个控件后右键可以选择水平分布或垂直分布间距可以指定具体数值。这个功能比手动拖拽精确得多。我通常会把同一行的按钮间距设为20px同一列的控件间距设为15px这样出来的界面节奏感比较统一。4.2 字体和字号在draw.io与代码中的映射关系draw.io里设置的字体大小是像素值但到了代码里不同图形库对字体的渲染方式不同。raylib的DrawText函数使用的字号是像素高度但实际渲染出来的文字宽度取决于字体文件。如果你在draw.io里用14px的字体画了一个按钮文字刚好填满按钮宽度到了raylib里可能因为字体不同而溢出或者留白过多。我的经验是在draw.io里标注字体大小时同时标注一个“安全边距”。比如按钮宽度160px文字区域预留120px左右各留20px。然后在代码里先加载字体测量文字的实际宽度如果超过120px就缩小字号或者换行。raylib提供了MeasureText函数可以在绘制之前先测量。这个步骤虽然多写几行代码但能保证界面在不同分辨率下都不会出现文字溢出的问题。另外draw.io默认的字体是Helvetica而raylib默认字体比较简陋。如果你对界面美观有要求建议在代码里加载一个开源字体比如思源黑体或者Roboto然后在draw.io里也用同样的字体预览。这样草图阶段和最终效果之间的差异会小很多。4.3 交互状态在草图阶段就要画出来很多人在draw.io里只画一个静态界面按钮的hover态、按下态、禁用态都不画结果开发的时候全靠猜。我的做法是在“状态”图层里把每个交互控件的主要状态都画出来用不同的颜色和边框样式区分。比如正常态用蓝色填充hover态用深蓝色按下态用更深的蓝色加内阴影禁用态用灰色。这样做的好处是开发在写事件处理代码时直接照着状态图实现就行不需要反复问设计“这个按钮按下去是什么效果”。而且评审的时候产品经理也能直观地看到交互反馈减少后期返工。draw.io支持复制图形并修改样式所以画状态变体并不费时间一个按钮的四个状态五分钟就能搞定。还有一个细节是焦点状态。对于需要键盘操作的界面控件的焦点态也很重要。我通常用虚线边框表示焦点在draw.io里画一个虚线矩形叠加在控件上就行。代码里对应的是绘制焦点框的逻辑。4.4 导出格式的选择什么时候用PNG什么时候用SVGdraw.io支持导出多种格式常用的有PNG、SVG、PDF和XML。我的选择逻辑是这样的给开发看的标注图用PNG因为PNG在各种聊天工具里都能直接预览不需要额外软件给文档用的界面图用SVG因为SVG是矢量格式放大不模糊适合放在在线文档或者Wiki里需要后续编辑的源文件当然用XML需要打印的用PDF。导出PNG的时候有一个选项叫“缩放”默认是100%。如果你的界面画布是1280x720导出100%就是1280x720像素放在文档里可能偏大。我通常导出200%或者300%这样在高分屏上看着更清晰。但要注意缩放比例太高会导致文件体积变大一般300%足够了。导出SVG的时候注意勾选“包含文本”选项这样SVG里的文字是可选中和可搜索的而不是被转成了路径。这个选项在“导出为SVG”对话框里默认可能是关闭的。打开之后SVG文件里的文字可以用CtrlF搜索对于需要查找特定控件的人来说很方便。5. 从界面草图到raylib代码的完整落地案例5.1 案例背景一个简单的媒体播放器控制面板假设我们要用raylib做一个简单的媒体播放器控制面板界面包含顶部标题栏、中间进度条、底部播放/暂停/停止按钮、音量滑块。目标分辨率是800x600。下面是从draw.io到代码的完整流程。首先在draw.io里新建一个800x600的画布背景设为深灰色#2D2D2D。顶部放一个800x60的矩形作为标题栏填充色稍浅#3D3D3D里面放一个文本“媒体播放器”。中间放一个700x20的进度条背景位置在y300x50。进度条上面叠加一个填充条表示当前进度宽度先设为35050%。底部放三个按钮每个160x48间距20px总宽度是1603202520居中放置起始x(800-520)/2140y500。音量滑块放在右下角用一个200x20的矩形加一个圆形滑块表示。所有控件的id都加上ui_前缀比如ui_title_bar、ui_progress_bg、ui_progress_fill、ui_btn_play、ui_btn_pause、ui_btn_stop、ui_volume_bg、ui_volume_handle。然后在“标注”图层里给每个控件写上坐标和尺寸。5.2 用Python脚本提取坐标并生成C头文件写一个Python脚本读取.drawio文件提取所有ui_开头的元素生成一个ui_layout.h文件。脚本的核心逻辑是遍历XML树找到所有mxCell节点检查id属性是否以ui_开头然后提取mxGeometry的x、y、width、height以及value属性的文字内容。生成的ui_layout.h大概是这样#ifndef UI_LAYOUT_H #define UI_LAYOUT_H typedef struct { const char *id; int x, y, w, h; const char *label; } UIElement; static const UIElement ui_elements[] { {ui_title_bar, 0, 0, 800, 60, }, {ui_title_text, 20, 15, 200, 30, 媒体播放器}, {ui_progress_bg, 50, 300, 700, 20, }, {ui_progress_fill, 50, 300, 350, 20, }, {ui_btn_play, 140, 500, 160, 48, 播放}, {ui_btn_pause, 320, 500, 160, 48, 暂停}, {ui_btn_stop, 500, 500, 160, 48, 停止}, {ui_volume_bg, 550, 550, 200, 20, }, {ui_volume_handle, 640, 545, 30, 30, }, }; static const int ui_element_count sizeof(ui_elements) / sizeof(ui_elements[0]); #endif然后在raylib的main.c里引入这个头文件在绘制循环里遍历ui_elements数组根据id判断绘制类型。比如id包含btn的绘制成按钮样式包含progress的绘制成进度条样式。这样界面布局就和draw.io里的设计完全一致了。5.3 在raylib里还原draw.io的视觉样式draw.io里的样式属性需要手动映射到raylib的绘制函数。比如圆角矩形raylib没有直接的圆角矩形函数需要用DrawRectangleRounded。填充色需要从十六进制转成raylib的Color结构体。字体大小需要和draw.io里设置的一致但要注意raylib的字体渲染可能需要加载自定义字体文件。我通常写一个辅助函数把draw.io的样式字符串解析成raylib的绘制参数。比如stylerounded1;fillColor#4A90D9;fontColor#FFFFFF;fontSize14;解析出圆角标志、填充色、文字颜色、字号然后调用对应的绘制函数。这个解析函数用C语言写大概一百行左右用字符串查找和sscanf就能实现。实测下来只要draw.io里的坐标和尺寸准确代码里的界面还原度能达到95%以上。剩下的5%差异主要来自字体渲染的细微不同这个通过调整字体文件或者字号可以解决。5.4 迭代流程改draw.io文件重新生成编译运行整个流程跑通之后界面迭代就变得非常高效。产品经理说要调整按钮位置你打开draw.io拖动按钮保存跑一下Python脚本重新编译raylib程序新界面就出来了。整个过程不超过两分钟。相比在代码里手动改坐标、编译、看效果、再改效率提升非常明显。而且这个流程对团队协作也友好。draw.io文件可以放在Git仓库里每次修改都有记录。Python脚本也可以版本管理。新加入的开发者只需要看draw.io文件和生成的ui_layout.h就能理解界面布局不需要去读大量的绘制代码。6. 常见问题排查与工具链配合6.1 draw.io文件打不开或者显示异常怎么办有时候draw.io文件会因为XML格式问题导致打不开最常见的原因是文件在传输过程中被截断或者手动编辑XML时引入了语法错误。排查方法是先用文本编辑器打开.drawio文件检查根节点是否完整所有标签是否闭合。如果文件不大可以直接看最后几行是否正常结束。另一个常见问题是浏览器缓存导致的显示异常。如果你用的是网页版draw.io清除浏览器缓存或者换一个无痕窗口试试。桌面版的话检查一下版本是否过旧更新到最新版通常能解决大部分兼容性问题。还有一种情况是文件里引用了外部图片但图片路径失效了。draw.io支持嵌入图片也支持引用外部图片。如果是引用外部图片文件移动到其他电脑上就会显示不出来。我的建议是界面草图里尽量用矢量图形不要嵌入位图这样文件自包含不会出现路径问题。6.2 和IDEA、VSCode等编辑器的配合热词里有人问“idea社区版怎么让xml里的文件不格式化”和“vscode配置c语言环境”这两个问题其实和draw.io的使用场景是相关的。如果你用IDEA或者VSCode管理项目draw.io文件可以作为项目资源放在docs/或者design/目录下。IDEA有draw.io插件可以直接在IDE里打开和编辑.drawio文件不需要切换到外部工具。VSCode也有类似的插件叫“Draw.io Integration”安装之后可以直接编辑。关于XML格式化的问题如果你不希望IDE自动格式化draw.io文件因为格式化可能会改变XML的结构导致draw.io无法识别可以在项目设置里把.drawio文件排除在格式化范围之外。IDEA里可以在“设置-编辑器-代码样式-XML”里添加排除模式VSCode里可以在settings.json里配置files.associations和格式化排除规则。6.3 用draw.io画界面时容易忽略的细节第一个细节是控件的层级顺序。draw.io里后画的图形默认在上面但你可以通过右键菜单调整层级。在代码里绘制顺序决定了哪个控件在上面。所以画的时候就要想好层级比如弹出菜单要放在最上层背景框要放在最下层。我通常会在“标注”图层里用文字注明每个控件的层级序号。第二个细节是控件的内边距。draw.io里的矩形边框是画在尺寸范围内的但代码里绘制矩形时边框可能向内或向外偏移。如果你在draw.io里画了一个160x48的按钮代码里也用160x48绘制但边框宽度是2px实际内容区域就变成了156x44。这个差异在精确布局时会有影响。我的做法是在draw.io里把边框宽度也标注出来代码里对应调整。第三个细节是文字对齐方式。draw.io支持左对齐、居中、右对齐代码里也需要对应设置。raylib的DrawText默认是左对齐居中需要手动计算偏移量。这个在生成代码时就要考虑进去否则所有文字都会偏左。6.4 性能考量界面元素多了之后怎么办当界面元素超过一百个时draw.io文件会变大解析和渲染速度会下降。这时候可以考虑分文件管理比如把主界面、设置界面、弹窗分别放在不同的.drawio文件里然后用一个主文件引用它们。draw.io支持“从文件导入”功能可以把其他文件的内容合并进来。代码这边raylib绘制大量矩形和文字时如果每帧都重新计算坐标会有性能开销。我的做法是在初始化阶段就把所有界面元素的坐标计算好存到数组里绘制循环里直接读取。对于静态界面甚至可以把整个界面渲染到一个RenderTexture上每帧只需要绘制这个纹理性能会好很多。当然如果界面有动态变化的部分就需要分层处理静态部分用纹理动态部分实时绘制。还有一个优化点是字体加载。raylib默认字体在放大时会有锯齿加载一个高质量的TTF字体文件设置合适的过滤模式可以显著提升文字渲染质量。但字体文件不要太大否则加载时间会变长。我通常用思源黑体的子集只包含界面中会用到的字符文件大小能控制在几百KB。7. 一些提高效率的draw.io使用技巧7.1 快捷键和批量操作draw.io的快捷键和主流绘图工具类似但有几个特别实用的CtrlShiftD是复制样式CtrlShiftV是粘贴样式这两个在统一多个控件外观时非常高效。CtrlG是组合CtrlShiftG是取消组合。AltShift方向键可以微调位置每次移动1px适合做精细对齐。批量操作方面选中多个控件后可以在右侧面板统一修改样式属性。比如选中所有按钮一次性把圆角从5改成8所有按钮同时生效。这个功能在调整整体风格时特别省事。还有一个隐藏技巧是“编辑数据”功能。选中一个图形按CtrlM可以打开编辑数据对话框里面可以给图形附加自定义属性。这些属性会保存在XML里解析的时候可以提取出来。比如你可以给按钮附加一个eventplay属性代码里根据这个属性绑定事件处理函数。这样draw.io文件就不仅仅是视觉稿还承载了交互逻辑的元数据。7.2 模板文件的创建和复用如果你经常画类似风格的界面建议创建一个模板文件。把常用的颜色、字体、控件样式都预设好保存为.drawio模板。下次新建文件时直接从模板复制而不是从空白开始。我的模板文件里包含了深色和浅色两套配色方案以及常用的按钮、输入框、标签、图标占位符。新建界面时复制模板文件改个名字然后开始画效率能提升一倍。模板文件还可以包含预设的图层结构。比如“布局”“标注”“状态”三个图层已经建好图层名称和颜色都设置好了。这样每次新建文件都不需要重新建图层。7.3 版本管理和团队协作的注意事项draw.io文件放在Git里管理时建议开启“压缩XML”选项。这个选项在“文件-属性”里开启后保存的文件体积更小diff的时候也更清晰。但要注意压缩后的XML可读性会下降如果你需要手动查看XML内容可以临时关闭压缩。团队协作时如果多人同时编辑同一个draw.io文件可能会出现冲突。draw.io的XML结构导致合并冲突比较难手动解决。我的建议是界面设计尽量由一个人主导其他人通过评论或者建议的方式参与而不是直接编辑文件。如果确实需要多人编辑可以分文件比如一个人负责主界面一个人负责弹窗最后合并。还有一个做法是使用draw.io的“修订历史”功能。网页版draw.io会自动保存修订记录你可以查看每次修改的内容也可以恢复到之前的版本。这个功能在误操作时很有用但桌面版没有这个功能需要自己做好版本备份。7.4 从draw.io到其他工具的迁移路径虽然draw.io很好用但有时候项目要求用其他工具比如Figma或者Axure。draw.io支持导出为SVG而SVG可以导入到大多数设计工具里。但要注意导入后的图层结构和样式可能会有变化需要手动调整。我的经验是如果确定要迁移到其他工具最好在draw.io里把样式简化去掉复杂的阴影和渐变这样导入后更容易还原。反过来如果你从其他工具迁移到draw.io可以把设计稿导出为SVG然后拖进draw.io。draw.io对SVG的支持还不错大部分矢量元素都能保留。但文字可能会变成路径导致无法编辑。所以迁移之前最好确认一下文字是否可编辑如果不行可能需要在draw.io里重新打字。界面绘制这件事工具只是手段核心还是把布局逻辑和交互状态想清楚。draw.io的好处是它足够轻、足够开放不会成为你工作流里的瓶颈。我从开始用它到现在最大的体会是不要把它当成一个“画图工具”而是当成一个“界面描述语言”的编辑器。你画的每一个矩形、每一个标注最终都会变成代码里的坐标和逻辑。想清楚这一点整个流程就顺了。