1# 支持无障碍 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @zhanghangkai10241--> 5<!--Designer: @lmleon--> 6<!--Tester: @fredyuan0912--> 7<!--Adviser: @HelloCrease--> 8 9## 概述 10 11ArkUI提供了丰富的无障碍能力,使开发者能够创建可访问的应用界面,满足视觉、听觉、运动和认知障碍等用户的需求。 12 13组件的[无障碍属性](../reference/apis-arkui/arkui-ts/ts-universal-attributes-accessibility.md)变化时,会触发辅助工具重新读取组件信息、无障碍服务重新扫描组件树、状态播报、虚拟节点动态更新等响应,这些机制确保辅助工具(如屏幕朗读)能及时感知并适配变化,为障碍用户提供连贯的体验。 14 15## 设置无障碍分组 16 17accessibilityGroup属性,用于设置是否启用无障碍分组。若启用,则该组件及其所有子组件将作为一个整体处理,无障碍服务不再单独处理各子组件。accessibilityGroup属性支持以下值: 18 19- false(默认):不启用无障碍分组。 20 21- true:启用无障碍分组。 22 23这里以Column组件为例,启用无障碍分组: 24 25```ts 26Column() { 27 Text("HelloWorld").fontSize(50).fontWeight(FontWeight.Bold) 28} 29.accessibilityGroup(true) 30``` 31 32## 设置无障碍重要性 33 34accessibilityLevel属性表示组件的无障碍重要性,用于控制组件是否能被无障碍服务识别,支持以下值: 35 36- "auto"(默认):当前组件由无障碍分组服务和ArkUI进行综合判断组件是否可被无障碍辅助服务所识别。 37 38- "yes":当前组件可被无障碍辅助服务所识别。 39 40- "no":当前组件不可被无障碍辅助服务所识别。 41 42- "no-hide-descendants":当前组件及其所有子组件均不可被无障碍辅助服务所识别。 43 44这里以Column组件为例,设置其无障碍重要性为可被无障碍辅助服务所识别: 45 46```ts 47Column() { 48 Text("HelloWorld").fontSize(50).fontWeight(FontWeight.Bold) 49} 50.accessibilityGroup(true) 51.accessibilityLevel("yes") 52``` 53 54## 设置无障碍文本 55 56accessibilityText属性用于为无文本内容的组件提供朗读文本。若组件已有文本,则优先播报无障碍文本。 57 58支持字符串或资源引用。 59 60这里以Column组件为例,设置其无障碍文本为“分组”: 61 62```ts 63Column() { 64 Text("HelloWorld").fontSize(50).fontWeight(FontWeight.Bold) 65} 66.accessibilityGroup(true) 67.accessibilityLevel("yes") 68.accessibilityText("分组") 69``` 70 71## 设置无障碍说明 72 73accessibilityDescription属性用于提供更详细的组件说明,播报时紧随文本内容之后。 74 75这里以Column组件为例,设置其无障碍说明为“分组”: 76 77```ts 78Column() { 79 Text("HelloWorld") 80} 81.accessibilityGroup(true) 82.accessibilityLevel("yes") 83.accessibilityText("分组") 84.accessibilityDescription("Column组件可以被选中,播报的内容是“分组”") 85``` 86 87## 设置无障碍虚拟子节点 88 89accessibilityVirtualNode属性,用于为自绘制组件添加虚拟无障碍节点,辅助工具会读取这些节点的信息而非实际显示内容。 90 91```ts 92@Entry 93@Component 94struct VirtualNodeExample { 95 @Builder customAccessibilityNode() { 96 Text("文本2") 97 .fontSize(50) 98 .fontWeight(FontWeight.Bold) 99 } 100 101 build() { 102 Column() { 103 Text("文本1") 104 .fontSize(50) 105 .fontWeight(FontWeight.Bold) 106 } 107 .accessibilityGroup(true) 108 .accessibilityLevel("yes") 109 .accessibilityVirtualNode(this.customAccessibilityNode) 110 } 111} 112``` 113 114## 设置无障碍节点是否被选中 115 116accessibilityChecked和accessibilitySelected是两个用于增强无障碍体验的属性,主要用于向屏幕朗读等辅助工具传达组件的选中状态。 117 118### 在支持多选的情况下,设置无障碍节点是否被选中 119 120accessibilityChecked属性,用于表示组件在支持多选的情况下是否被勾选(如复选框、开关按钮等二态或三态组件),适用于需要明确“选中/未选中”语义的场景,支持以下值: 121 122- undefined(默认):由系统自动判断(依赖组件自身的状态,如Toggle组件的isOn属性)。 123 124- false:未选中。 125 126- true:选中(如复选框打勾)。 127 128这里以Column组件为例,设置其在支持多选的情况下被选中: 129 130```ts 131Column() { 132 Text("HelloWorld").fontSize(50).fontWeight(FontWeight.Bold) 133} 134.accessibilityGroup(true) 135.accessibilityLevel("yes") 136.accessibilityText("分组") 137.accessibilityDescription("Column组件可以被选中,播报的内容是“分组”") 138.accessibilityChecked(true) 139``` 140 141### 在支持单选的情况下,设置无障碍节点是否被选中 142 143accessibilitySelected属性,用于表示组件在支持单选的情况下是否被选择(如单选列表项、标签页等),适用于需要区分“当前选中项”的场景(如单选组、导航菜单),支持以下值: 144 145- undefined(默认):由系统自动判断。 146 147- false:未选中。 148 149- true:当前选中。 150 151这里以Column组件为例,设置在支持单选的情况下由系统自行确定其选中状态: 152 153```ts 154Column() { 155 Text("HelloWorld").fontSize(50).fontWeight(FontWeight.Bold) 156} 157.accessibilityGroup(true) 158.accessibilityLevel("yes") 159.accessibilityText("分组") 160.accessibilityDescription("Column组件可以被选中,播报的内容是“分组”") 161.accessibilitySelected(undefined) 162``` 163 164### accessibilityChecked属性与accessibilitySelected属性的关键区别 165 166在ArkUI无障碍属性中,accessibilityChecked和accessibilitySelected均用于表示组件的状态,但二者应用场景与语义含义存在本质差异。以下是二者的对比: 167 168| 属性 | accessibilityChecked | accessibilitySelected | 169| ------- | ------------------------ | --------------------- | 170| 常见场景 | 复选框、开关等二态/三态组件。 | 单选列表、标签页等互斥选择场景。 | 171| 语义目标 | 控件物理状态(如开关是否打开)。 | 导航焦点项(如列表当前选中项)。 | 172| 状态持久性 | 通常需显式保存(如表单提交)。 | 临时性(随焦点移动变化)。 | 173| 典型组件 | Checkbox,Toggle。 | List,Tabs。 | 174 175## 使用建议 176 177- 优先级控制 178 179 通过accessibilityLevel确保关键操作可被识别。 180 181- 语义化描述 182 183 为图标、图片等非文本元素添加accessibilityText和accessibilityDescription。 184 185- 分组优化 186 187 对复杂布局使用accessibilityGroup减少冗余播报。 188 189## 场景示例 190 191该示例主要演示accessibilityText无障碍文本和accessibilityDescription无障碍说明的播报内容。 192 193其中,对于该组件的无障碍文本的内容,在既拥有文本属性又拥有无障碍文本属性的情况下,当组件被选中时,仅播报无障碍文本内容。 194 195```ts 196@Entry 197@Component 198struct Index { 199 200 @Builder customAccessibilityNode() { 201 Column() { 202 Text(`virtual node`) 203 } 204 .width(10) 205 .height(10) 206 } 207 208 build() { 209 Row() { 210 Column() { 211 Text("文本1") 212 .fontSize(50) 213 .fontWeight(FontWeight.Bold) 214 Text("文本2") 215 .fontSize(50) 216 .fontWeight(FontWeight.Bold) 217 } 218 .width('100%') 219 .accessibilityGroup(true) 220 .accessibilityLevel("yes") 221 .accessibilityText("分组") 222 .accessibilityDescription("Column组件可以被选中,播报的内容是“分组”") 223 .accessibilityVirtualNode(this.customAccessibilityNode) 224 .accessibilityChecked(true) 225 .accessibilitySelected(undefined) 226 } 227 .height('100%') 228 } 229} 230``` 231 232 233