提高应用无障碍性

努力让您的 Android 应用能够惠及每个人,包括有无障碍需求的用户。

视力障碍、色盲、听力障碍、行动不便、认知障碍以及许多其他残障人士都在使用 Android 设备。当您在开发应用时考虑到无障碍需求,您就为这些用户改善了体验。

本页面提供了实现关键无障碍元素的指南,以便每个人都能更轻松地使用您的应用。如需深入了解如何让您的应用更易于访问,请参阅 改善应用无障碍性的原则

提高文本可见性

对于应用中的每组文本,我们建议颜色对比度(即文本颜色与背景颜色之间的感知亮度差异)高于特定阈值。具体的阈值取决于文本的字体大小以及文本是否加粗。

  • 如果文本小于 18sp,或者文本加粗且小于 14sp,请使用对比度至少为 4.5:1 的前景色和背景色(即 颜色对比度比率)。
  • 对于所有其他文本,请将颜色对比度比率设置为至少 3:1。

下图展示了两个文本与背景颜色对比的示例。

Two examples of the word 'Text' on colored backgrounds. The example on the left has low color contrast between the text and background, while the example on right has sufficient color contrast.
图 1. 低于推荐值(左)和符合要求(右)的颜色对比度。

要检查应用中的文本与背景颜色对比度,请使用在线颜色对比度检查器或 Accessibility Scanner 应用。

使用大型、简单的控件

如果应用的控件更易于查看和点击,那么它将更易于使用。对于触摸界面,我们建议每个交互式 UI 元素的可聚焦区域(即触摸目标尺寸)至少为 48dp x 48dp。越大越好。

在 Jetpack Compose 中,许多内置的 Material 组件(如 ButtonIconButtonListItem)已经强制执行了此最小尺寸。但是,在创建自定义交互元素时,您需要自行设置尺寸。

在下面的代码片段中,通过为小型 UI 元素提供更大的触摸目标,使其变得易于访问:

@Composable
private fun LargeBox() {
    var clicked by remember { mutableStateOf(false) }
    Box(
        Modifier
            .size(100.dp)
            .background(if (clicked) Color.DarkGray else Color.LightGray)
    ) {
        Box(
            Modifier
                .align(Alignment.Center)
                .clickable { clicked = !clicked }
                .background(Color.Black)
                .sizeIn(minWidth = 48.dp, minHeight = 48.dp)
        )
    }
}

有关触摸目标尺寸的更多信息,请参阅 最小触摸目标尺寸

描述每个 UI 元素

对于应用中的每个 UI 元素,请包含一个描述其用途的说明。在大多数情况下,您应在元素的 contentDescription 属性中包含此说明,如下面的代码片段所示:

@Composable
private fun ShareButton(onClick: () -> Unit) {
    IconButton(onClick = onClick) {
        Icon(
            imageVector = Icons.Filled.Share,
            contentDescription = stringResource(R.string.label_share)
        )
    }
}

请注意,您不需要为 Text 可组合项提供 contentDescription。Android 无障碍服务(如 TalkBack)会自动朗读文本本身。

在为应用的 UI 元素添加描述时,请牢记以下最佳实践:

  • 使用描述来传达交互的目的和结果,而不是视觉细节。使用 Role 语义属性(例如 Role.ButtonRole.Switch)来公开 UI 元素的类型。这样,屏幕阅读器可以正确地播报该元素。

  • 避免描述中的冗余。例如,如果在应用中选择某个按钮会执行“提交”操作,请将按钮的描述设为 "提交",而不是 "提交按钮"

  • 每个描述都应该是唯一的。这样,当屏幕阅读器用户遇到重复的元素描述时,他们可以正确识别出焦点所在的元素此前已经获得过焦点。特别是,像 LazyColumn 这样的列表中的每个项目都应该有不同的描述,每项描述都应反映该项目特有的内容,例如位置列表中的城市名称。

  • 使用 hideFromAccessibility API 标记纯装饰性元素,以便无障碍服务可以忽略它们。如果 UI 元素具有 contentDescription 参数但纯粹是装饰性的(例如作为其他 UI 元素一部分的 Icon),请传递 null 以避免重复标记。对于更复杂的用例,请参阅 合并与清除

  • 测试您的代码,确保内容描述按预期传达。Android Lint、Compose 测试以及手动和自动测试工具可以标记常见问题并暴露您实现中存在的问题。

其他资源

要详细了解如何使您的应用更易于使用,请参阅以下其他资源:

Codelabs

视频

视图内容