Excalidraw:当手绘草图遇上增强现实设计
在一场工业维修 AR 应用的远程评审会上,产品经理刚描述完需求:“工人戴上头显后,眼前要浮现出设备故障码、三步维修指引,还有红色闪烁警告。” 话音未落,UX 设计师已在共享白板上拖动几个矩形、画了条波浪箭头——不是在 Figma 里精调边距,而是在一个看起来像是“纸笔随手涂鸦”的界面上。30 秒后,一张带着轻微抖动线条的 AR 界面草图跃然屏上,开发同事立刻指着其中一个按钮说:“这个提示能不能语音播报?” 这一切发生得如此自然,仿佛大家正围坐在同一张白板前。
这不是未来场景,而是今天使用Excalidraw的真实工作流。这个开源虚拟白板工具,正悄然改变着 AR 应用界面的设计方式。
传统 AR UI 设计常陷于两难:要么用专业工具(如 Figma + Unity)建模,耗时数日却难以快速验证;要么靠 PPT 手绘示意,沟通成本高且无法实时迭代。Excalidraw 的出现打破了这一僵局——它不追求像素级精确,反而以“不够完美”的手绘风格,成为团队早期构思的理想载体。
其核心魅力在于三个关键技术的融合:算法模拟的手绘渲染、低延迟的多人协作同步机制,以及与 AI 自然语言生成的无缝集成。这三者共同构建了一个轻量但高效的创意加速器。
先看那个让人一眼就放松下来的“手绘感”。Excalidraw 并非简单加个滤镜,而是通过一套“去规范化”算法,在 SVG 渲染层对路径点施加随机扰动。比如你画一条直线,系统并不会原样呈现,而是悄悄偏移每个坐标点几像素,配合粗细变化,最终生成一条看似人手绘制的线条。更巧妙的是,每次重绘都会产生细微差异,强化了“这是草图,别太较真”的心理暗示。
function generateSketchLine(points: Array<{ x: y: number }>, roughness = 1.5) { return points.map((point, index) => { const offsetX = (Math.random() - 0.5) * roughness; const offsetY = (Math.random() - 0.5) * roughness; return { x: point.x + offsetX, y: point.y + offsetY, }; }); }这段代码正是这种“可控混乱”的体现。roughness参数像一支可调节的马克笔,决定线条是略带潦草还是近乎规整。实际工程中,Excalidraw 还会结合预设图形模板(如箭头、文本框),避免频繁重计算影响性能。这种设计哲学很聪明:牺牲一点精度,换来了极大的心理自由度——设计师不再纠结对齐和配色,而是专注于信息结构和交互逻辑本身。
而这套草图一旦进入协作环节,真正的价值才开始释放。Excalidraw 的同步机制基于 WebSocket 构建,采用一种轻量化的操作转换思想。每个图形元素都有全局唯一 ID,用户的每一次增删改都会被打包成增量消息广播出去:
{ "type": "add", "element": { "id": "rect-1a2b3c", "type": "rectangle", "x": 120, "y": 80, "width": 100, "height": 60 }, "timestamp": 1719834567890 }接收端收到消息后,并不会全量重绘,而是调用refreshScene方法进行差分更新。这意味着即使十个人同时编辑不同区域,彼此也不会卡顿干扰。我在参与某跨国团队项目时深有体会:柏林的 UX 在调整布局,班加罗尔的工程师正在标注技术约束,而旧金山的产品经理用评论功能标出优先级变更——所有动作几乎实时可见,连光标移动都清晰可辨。这种接近物理白板的临场感,远非异步传图能比。
更令人兴奋的是 AI 功能的引入。从 2023 年起,Excalidraw 开始实验性支持自然语言生成图表。当你输入“画一个登录页面,包含用户名、密码输入框和登录按钮”,背后其实是这样一套流程在运作:
- 前端将文本发送至 LLM(如 GPT-3.5-turbo);
- 模型返回结构化 JSON,描述应创建哪些元素及其位置;
- 客户端解析并调用
excalidraw.addElements()渲染出来。
@app.post("/generate-sketch") async def generate_sketch(request: SketchRequest): system_msg = """ 你是一个UI草图生成器。请根据用户描述生成一个Excalidraw兼容的JSON结构, 包含elements数组,每个元素有type、x、y、width、height、label字段。 使用手绘风格常用元素:rectangle, text, arrow, diamond。 """ response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "system", "content": system_msg}, {"role": "user", "content": request.prompt}], temperature=0.7 ) try: parsed_json = extract_json_from_text(response.choices[0].message['content']) return {"status": "success", "data": parsed_json} except: return {"status": "error", "message": "Failed to parse LLM output"}虽然目前 AI 生成的布局仍需人工微调——毕竟模型还不太理解“视觉重量平衡”这类抽象概念——但它极大压缩了从想法到可视化的路径。我曾见过一位非设计背景的客户成功经理,仅用两句口语描述就生成了一份 AR 巡检应用的初稿,随后整个团队在此基础上展开讨论。这种“零门槛表达”能力,正是敏捷开发最需要的。
在一个典型的 AR 界面设计流程中,这套组合拳发挥着关键作用:
- 需求输入阶段:产品经理口头提出构想;
- AI 快速生成:输入自然语言指令,获得初步布局;
- 手动优化与标注:UX 调整结构,添加交互说明;
- 多人评审批注:开发、安全、运维同步反馈;
- 导出集成原型:将 JSON 或 PNG 导入 AR 引擎(如 Three.js + AR.js)作为 HUD 参考;
- 测试反馈闭环:AR 实机测试截图上传回白板,对比迭代。
整个过程可在几小时内完成一轮,相比传统模式提速十倍以上。更重要的是,它解决了跨职能沟通中的“认知鸿沟”问题:技术人员不再面对模糊的需求文档,非技术人员也能看懂即将实现的效果。
当然,实践中也有需要注意的地方。比如 AI 生成建议拆解为模块级任务(“只生成顶部状态栏”而非整页),以提高可控性;再如导出时需注意坐标映射——Excalidraw 默认单位是像素,而 AR 场景可能需要按视口百分比缩放。此外,若用于企业级协作,部署私有实例并配置 JWT 认证和房间权限控制,能有效防止敏感设计泄露。
值得强调的是,Excalidraw 并非要取代 Figma 或 Sketch,它的定位非常清晰:专注前期构思,而非终稿输出。正因如此,它才能做到足够轻快、开放和包容。其底层数据结构极为简洁——所有图形以 JSON 存储,便于版本管理与程序化处理。这也为后续与 WebXR、ARCore 等平台深度集成提供了可能。
想象这样一个未来:你说出“帮我设计一个博物馆导览 AR 应用,主界面显示当前展品名称,下方有语音讲解按钮和收藏图标”,系统不仅生成二维草图,还能直接投射到手机摄像头画面中预览效果。这并非遥不可及——随着 AI 对空间理解能力的提升,Excalidraw 完全有可能进化为“意图驱动的设计中枢”。
现在的它已经证明了一件事:在技术创新初期,最重要的不是完美呈现,而是快速达成共识。Excalidraw 用最朴素的方式告诉我们,有时候一支“数字铅笔”,比一整套精密工具更能激发创造力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考