4、UI组件库与设计系统:Ant Design、Material Design、自建组件库在座舱中的适配

说到座舱HMI的UI组件库,我其实挺有感触的。早年做车载项目时,大家习惯从零开始画控件——一个按钮、一个滑块,全凭手写。后来发现效率实在太低,而且不同项目之间风格飘忽不定。于是,组件库和设计系统就成了绕不开的话题。

今天咱们聊聊三个主流方向:Ant DesignMaterial Design,以及自建组件库。它们在座舱里怎么用?有哪些坑?我踩过哪些雷?嗯,咱们一个一个说。

4.1 为什么座舱需要组件库?

你想想看,座舱里的UI控件其实很固定:导航栏、卡片、列表、开关、滑块、弹窗……如果每个页面都重新画一遍,不仅开发累,测试也累。更关键的是——一致性

我见过一个项目,空调控制面板用了圆角按钮,音乐播放器却用了直角按钮。用户一看就觉得「这不是同一辆车」。所以组件库的核心价值,说白了就是:统一视觉、提升效率、降低维护成本

核心原则:组件库不是「拿来就用」,而是「拿来再改」。座舱场景对安全性、响应速度、触控精度的要求,远高于普通App。

4.2 Ant Design 在座舱中的适配

Ant Design 是蚂蚁金服出品的企业级UI库,设计规范很成熟。我最早在车载项目里尝试用它,是在一个中控娱乐系统的原型阶段。

优点很明显:

  • 组件丰富:表格、表单、日期选择器、树形控件……开箱即用
  • 设计规范统一:间距、颜色、字体都有明确标准
  • 社区活跃:遇到问题基本能搜到答案

但座舱里用,有几个坑:

  • 触控优化不足:Ant Design 默认是为鼠标设计的。按钮点击区域偏小,在车载触屏上容易误触。我建议把最小触控区域放大到 48x48dp。
  • 动画性能问题:Ant Design 的弹窗、菜单动画用了大量 CSS 过渡。在车机低端芯片上,掉帧明显。我曾经在项目里把动画全部关掉,换成 200ms 的简单淡入淡出。
  • 字体与图标:Ant Design 默认使用「-apple-system」字体,在车机 Linux 系统上可能不兼容。图标库也偏「互联网风格」,不适合车载的「安全、稳重」调性。

我的建议:如果团队前端能力较强,可以把 Ant Design 作为「底层参考」,提取它的布局规范和色彩体系,但组件要重新封装。别直接拿过来就用。

4.3 Material Design 在座舱中的适配

Material Design 是 Google 的设计语言,强调「纸张隐喻」和「层级阴影」。说实话,它在座舱里比 Ant Design 更「危险」。

为什么?

  • 阴影层级过多:Material Design 喜欢用 elevation(海拔)来表达层级。但在车载强光环境下,阴影几乎看不见。而且多层阴影叠加,GPU 渲染压力大。
  • 动效太花哨:Material Design 的涟漪效果、转场动画,在车机上容易让用户觉得「卡顿」。我试过在低端芯片上跑 Material 的 FAB 按钮动画,帧率直接掉到 20fps。
  • 色彩饱和度偏高:Material Design 的默认配色(比如蓝色 #2196F3)在车载 OLED 屏幕上容易产生视觉疲劳。夜间模式下尤其刺眼。

但也不是一无是处:

  • 它的布局规范(比如 8dp 网格系统)非常值得借鉴。
  • 它的无障碍设计(对比度、字体大小)做得很好,座舱里可以直接参考。

避坑指南:我曾经在一个项目中直接用了 Material Design 的 Slider 组件。结果发现,在触屏上滑动时,反馈延迟超过 100ms。后来我们重写了触摸事件处理,才勉强达标。所以——Material Design 的组件,一定要做触控延迟测试

4.4 自建组件库:最稳妥的选择

说实话,做了几个项目之后,我个人更倾向于自建组件库。不是因为我喜欢造轮子,而是因为座舱场景太特殊了。

自建组件库的优势:

  • 完全可控:每个组件的渲染逻辑、触摸反馈、动画曲线,都能按需定制。
  • 性能优先:可以去掉所有不必要的样式和动画,只保留核心功能。
  • 品牌统一:车厂的品牌色、字体、图标,都能无缝融入。

但自建也有代价:

  • 开发周期长:一个成熟的组件库,至少需要 3-6 个月打磨。
  • 维护成本高:每个组件都要写文档、做测试、处理兼容性。

我建议的做法是:基于一个轻量级框架(比如 React + styled-components 或 Vue + Tailwind),从最常用的 10-15 个组件开始。比如:

// 一个简单的车载按钮组件示例
const CarButton = styled.button`
  min-width: 48px;
  min-height: 48px;
  padding: 12px 24px;
  border-radius: 8px;
  background: ${props => props.primary ? '#1A73E8' : '#E8E8E8'};
  color: ${props => props.primary ? '#FFFFFF' : '#333333'};
  font-size: 16px;
  font-weight: 500;
  border: none;
  cursor: pointer;
  transition: background 0.2s ease;

  &:active {
    background: ${props => props.primary ? '#1557B0' : '#D0D0D0'};
  }
`;

你看,这个组件只做了三件事:设置最小触控区域、定义颜色、添加按下反馈。没有多余的阴影、没有动画、没有渐变。这就是座舱需要的「干净」。

4.5 如何选择?一张表说清楚

维度 Ant Design Material Design 自建组件库
组件丰富度 ★★★★★ ★★★★☆ ★★☆☆☆(初期)
触控优化 ★★☆☆☆ ★★★☆☆ ★★★★★
性能表现 ★★★☆☆ ★★☆☆☆ ★★★★★
品牌定制 ★★★☆☆ ★★☆☆☆ ★★★★★
维护成本 ★★☆☆☆ ★★☆☆☆ ★★★★☆
适合场景 快速原型、非核心页面 概念验证、设计参考 量产项目、长期维护

4.6 我的最终建议

如果你问我,座舱里到底用哪个?我的答案是:混合使用

  • Ant Design 的布局规范和色彩体系,作为设计系统的「骨架」。
  • Material Design 的无障碍设计原则,作为「安全底线」。
  • 自建组件库 实现所有交互控件,作为「血肉」。

这样既不用从零开始画设计规范,又能保证最终产品的性能和一致性。嗯,我在最近一个项目中就是这么做的,效果还不错。

一个小技巧:自建组件库时,可以先把 Ant Design 的 Button、Input、Slider 三个组件「拆开」看看。理解它们的结构,再重新封装成车载版本。这样能省不少时间。

好了,组件库这块就聊到这儿。下一章咱们聊聊设计系统的落地与维护——怎么让团队所有人都用同一套组件,而不是各画各的。到时候见。