鸿蒙 Accessibility Kit 全景解析:无障碍开发从哪里下手

无障碍(Accessibility)这个词,很多开发者第一反应是"视障用户才需要",然后把它排到需求清单的最末尾。但实际上,无障碍覆盖的范围远比视障广得多——色弱、听障、行动不便、老年人,甚至是临时性的功能障碍(比如一只手打着石膏),都算无障碍服务的对象。这篇文章想把鸿蒙 Accessibility Kit 的整体框架梳理清楚,帮你在项目里真正落地无障碍,而不是停留在"知道有这么回事"。

一、无障碍到底在解决什么问题

官方文档对无障碍的定义很直白:确保任何人在任何情况下都能平等、便捷地获取信息。它的目标是缩小不同人群——不同社会阶层、地区、年龄段、健康状况——在信息理解和交互上的数字鸿沟。

落到产品层面,无障碍设计要处理几个典型场景:

  • 视障用户:完全看不见或视力极差,需要屏幕朗读把界面元素"读"出来
  • 低视力用户:能看见但看不太清,需要大字体、高对比度、色彩校正
  • 色盲/色弱:无法区分某些颜色,需要靠文字、图标、形状而非纯颜色传递信息
  • 听障用户:听不到提示音,需要视觉化的提醒和字幕
  • 老年人:操作反应慢,需要更大的点击区域、更简单的流程、更高的容错

很多人习惯把无障碍等同于"屏幕朗读",其实那只是其中一个子集。鸿蒙把系统提供的辅助能力分成了屏幕朗读、大字体、高对比度文字、色彩校正、颜色反转、单声道音频、音量平衡、屏幕触控等一整套系统服务。

二、Accessibility Kit 在架构中的位置

要理解 Accessibility Kit,得先搞清楚它和另外两个 Kit 的关系,这个关系决定了你在代码里到底该调谁。

Accessibility Kit 的文档里有一节"与相关Kit的关系",写得比较简略,但信息量很大:ArkUI Kit 负责无障碍组件属性的定义和无障碍事件的发送

翻译成人话就是:

  • 如果你要给一个组件设置无障碍文本、描述信息、角色类型——这些是声明式属性,写在 .accessibilityText().accessibilityRole() 里,用的是 ArkUI 的能力
  • 如果你要主动发送无障碍事件,比如主动聚焦、主动播报一段话——这些是命令式操作,调用 accessibility.sendAccessibilityEvent(),才用到 Accessibility Kit

这是一个容易混淆的点。日常开发里,你 80% 的精力都花在 ArkUI 的无障碍属性上,真正用 Accessibility Kit API 的场景主要集中在两类:

  1. 无障碍状态查询:查询屏幕朗读、触摸浏览等功能有没有开启,好让应用根据开启状态调整行为
  2. 无障碍事件发送:主动聚焦某个组件、主动朗读某段内容

理解了这层分工,再看文档目录就不乱了。

三、Accessibility Kit 的两块核心能力

官方把能力范围归纳为两块,简单但准确。

3.1 无障碍状态查询

应用有时需要知道当前设备开了哪些无障碍功能,才能做出对应的适配。比如:

  • 屏幕朗读开着的时候,你可能有专门的播报逻辑
  • 触摸浏览开着的时候,点击区域可能需要放大

这类接口让应用从"被动地被系统朗读"变成"主动感知无障碍环境",是精细化适配的基础。

3.2 无障碍事件发送

这是 Accessibility Kit 最有价值的部分。ArkUI 的声明式属性解决的是"静态标注"问题——组件长什么样、该怎么读。但很多无障碍体验是动态的、事件驱动的

  • 列表数据刷新后,要主动朗读"已加载 20 条新消息"
  • 某个控件被隐藏后,要主动把焦点移到邻近的控件上
  • 网络断了,要主动播报"网络连接已中断"

这些场景光靠静态属性搞不定,必须通过 sendAccessibilityEvent() 主动通知系统。这就是 Accessibility Kit 事件发送接口存在的意义。

四、无障碍开发的核心对象:事件和焦点

无障碍交互本质上是围绕两个概念展开的——焦点朗读

焦点(Focus):屏幕朗读模式下,用户通过滑动手指在不同界面元素之间移动。当前被选中的那个元素,就是"焦点"。焦点的走焦顺序、聚合粒度、跳转逻辑,直接决定了视障用户操作的效率和体验。

朗读(Announcement):系统把焦点元素的信息用语音读出来。读什么内容、按什么格式读、什么时候读,这些都由无障碍属性决定。

围绕这两个概念,ArkUI 和 Accessibility Kit 提供了一整套工具:

  • accessibilityText() —— 控制元素"读什么"
  • accessibilityGroup() —— 控制"哪些元素算一个焦点"
  • accessibilityRole() —— 控制"这个元素是什么类型"(按钮、图片、文本)
  • accessibilitySelected() / accessibilityStateDescription() —— 控制"状态怎么读"
  • accessibilityNextFocusId() —— 控制"焦点下一步去哪"
  • sendAccessibilityEvent() —— 主动触发聚焦和播报

理解了焦点和朗读这两个核心,后面具体 API 的学习就都有锚点了。

五、从 Which 到 How:无障碍落地的真实路径

很多团队做无障碍最大的障碍不是技术,而是"不知道从哪开始"。我的建议是分三步走:

第一步:跑通基础标注。 给所有可交互的控件加上无障碍文本和角色。这一步不涉及复杂逻辑,但能覆盖 60% 以上的无障碍问题。

第二步:处理焦点和组合。 把功能相关的多个组件聚合成一个焦点,避免朗读碎片化;给动态变化的内容配置主动播报;把走焦顺序调成符合用户直觉的顺序。

第三步:做场景化验证。 用真实的手势和流程走一遍屏幕朗读,找出"读得出来但听不懂"的地方。很多问题只有真正关上屏幕用一遍才能发现。

无障碍不是一次性项目,它应该像性能优化一样,贯穿在每次迭代里。

六、模拟器的坑

如果你在模拟器上开发无障碍功能,有几个能力差异要知道:

  • 不支持放大手势、声音修复、助听设备、闪烁提醒等功能
  • 其他通用差异参考官方模拟器说明

所以屏幕朗读的核心开发在模拟器上能做,但涉及硬件辅助的验证,还是得真机。别在模拟器上纠结"为什么这个功能没反应",先确认是不是模拟器本身不支持。

七、总结一下下怕

无障碍开发有个挺有意思的特点:它逼着你把产品逻辑想得更清楚。一个信息架构混乱、交互不明确的界面,正常用户靠"猜"能蒙过去,视障用户靠朗读就完全用不了。所以做好无障碍,很多时候也是在倒逼产品体验的整体提升。

接下来的系列文章,我会沿着"标注 → 组合 → 焦点 → 播报 → 验证"这条线,把每个环节的具体 API、代码示例和踩坑经验拆开讲。这篇先搭个框架,帮你在脑子里建立无障碍开发的完整地图。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐