4、车载HMI框架解析:CarUI库、多窗口管理、安全驾驶模式下的界面约束
好,咱们进入第四章。这一章聊的是车载HMI框架,说白了就是车机上那些界面怎么画、怎么管、怎么在安全前提下不乱跳。我做了这么多年车载,发现很多开发者把HMI想简单了——不就是个Android界面吗?嗯,真不是。
车机上的UI,跟手机完全是两码事。手机你爱怎么折腾都行,车机上不行。驾驶员在开车,你一个弹窗飞出来,那可能就出事了。所以这一章,我重点讲三个东西:CarUI库、多窗口管理、还有安全驾驶模式下的界面约束。
4.1 CarUI库:专为车载打造的UI组件
Google搞了个CarUI库,其实就是AndroidX的一个扩展。它专门为车载场景设计了一套组件。我刚开始接触时觉得这玩意儿有点鸡肋,后来真用上了才发现——真香。
CarUI库解决了什么问题?说白了就是三个:
- 触摸区域够大——车机上手指头粗,按钮太小容易误触
- 对比度够高——阳光下看不清?CarUI的配色专门优化过
- 焦点管理——旋钮、方向盘按键都能顺畅操作
举个例子,CarUI里的CarButton,默认最小触摸区域是48dp。我见过一些项目自己写Button,结果设成32dp,驾驶员开车时根本点不准。嗯,这就是坑。
// CarUI库中的典型用法
// 注意:这里用的是CarButton,不是普通Button
CarButton button = new CarButton(context);
button.setText("导航");
button.setIcon(R.drawable.ic_nav);
// 最小触摸区域已经由CarUI保证
button.setMinTouchSize(48); // 单位dp
核心要点:CarUI库不仅仅是换皮,它从底层保证了车载场景下的可用性和安全性。我个人建议,所有车载应用都优先使用CarUI组件,别自己造轮子。
4.2 多窗口管理:车机上的分屏艺术
车机上的多窗口,跟手机的分屏完全不是一个概念。手机分屏是你主动拖出来的,车机上的多窗口是系统强制分配的。
为什么?因为车机上同时显示的内容太多了。导航、音乐、车辆信息、空调控制……这些都得同时出现。你不能让用户自己去拖窗口,那太危险了。
Android Automotive里,多窗口管理是通过CarMultiWindowManager来实现的。我记得第一次看这个API时,觉得它跟手机上的ActivityManager差不多,后来才发现完全不是一回事。
车机上的窗口分三种:
| 窗口类型 | 说明 | 示例 |
|---|---|---|
| 主窗口 | 占据屏幕大部分区域,通常是导航 | 地图、导航界面 |
| 副窗口 | 侧边或底部的小窗口 | 音乐播放器、车辆状态 |
| 浮动窗口 | 临时弹出的小窗,不能遮挡关键信息 | 来电提醒、语音提示 |
这里有个坑:浮动窗口不能盖住导航区域。我曾经在一个项目里,来电弹窗把导航路线给挡住了,结果驾驶员错过了路口……嗯,从那以后我再也不敢让浮动窗口乱飘了。
避坑指南:多窗口布局一定要考虑驾驶场景。导航区域永远是最高优先级,任何窗口都不能遮挡它。我曾经见过一个方案,把音乐播放器放在导航上面,结果被测试团队直接打回。
4.3 安全驾驶模式下的界面约束
这个才是重头戏。安全驾驶模式,说白了就是车在行驶时,界面能做什么、不能做什么。
Android Automotive里有个CarDrivingStateManager,它会告诉你当前车辆的状态:停车、行驶、还是未知。然后系统会根据这个状态,对界面进行约束。
约束规则其实很简单:
- 停车时——所有功能都能用,包括视频、游戏、设置
- 行驶时——只能显示驾驶相关信息,视频播放、文字输入、复杂设置全部禁用
- 未知状态——按最严格的来,默认禁止所有非必要操作
你想想看,如果驾驶员在高速上还能刷抖音,那得多危险。所以系统会强制限制某些Activity的启动。具体怎么限制?通过CarUxRestrictions这个类。
// 检查当前驾驶状态下的界面约束
CarUxRestrictionsManager uxManager =
car.getCarManager(CarUxRestrictionsManager.class);
CarUxRestrictions restrictions = uxManager.getCurrentCarUxRestrictions();
if (restrictions.isRequiresDistractionOptimization()) {
// 当前处于行驶状态,需要优化界面
// 比如禁用视频播放、限制文字输入
disableVideoPlayback();
limitTextInput();
} else {
// 停车状态,所有功能可用
enableAllFeatures();
}
个人经验:我建议在应用启动时就注册CarUxRestrictionsManager的监听器。因为驾驶状态随时可能变化,比如等红灯时停车、绿灯时行驶。如果不监听变化,界面可能一直处于限制状态,用户体验很差。
还有一个细节:安全驾驶模式下的动画限制。行驶时,界面动画的时长不能超过200毫秒,而且不能有闪烁效果。为什么?因为动画太花哨会分散驾驶员注意力。我见过一个项目,启动动画做了3秒的旋转效果,结果被安全评审直接毙掉。
嗯,这里要注意:不是所有动画都要禁用,而是要有节制。比如导航的转弯提示动画,那是必要的。但那些为了炫酷而做的动画,在行驶时最好关掉。
小结
这一章的内容其实就三个关键词:CarUI库、多窗口、安全约束。它们共同构成了车载HMI的骨架。
CarUI库解决了「怎么画」的问题,多窗口管理解决了「怎么排」的问题,安全驾驶模式解决了「什么时候能用」的问题。三者缺一不可。
我个人觉得,很多车载项目出问题,都是因为只关注了UI好不好看,忽略了安全约束。你想想看,一个再漂亮的界面,如果让驾驶员分心了,那就是失败的。
下一章我们会聊车载音频系统,那又是一个大坑。到时候再细说。