让应用使用起来更没有障碍

尝试使您的 Android 应用可供所有人使用,包括具有无障碍功能需求的用户。

视力受损、色盲、听力受损、精细动作失能的人、以及有认知障碍和许多其他残疾状况的人会使用 Android 设备。如果您能够在开发应用时考虑无障碍功能,便可以改善用户体验,满足有无障碍功能需求的用户。

本页面介绍了应该依据哪些准则来实现无障碍功能的关键元素,以便所有人都可以更轻松地使用您的应用。如需获得有关如何让您的应用使用起来更没有障碍的更深入指导,请参阅改进应用无障碍功能要遵循的原则

让文字更清晰易辨

对于应用中的每组文字,建议将色彩对比度(即文字颜色与文字后面的背景颜色之间感知到的亮度差异)设为高于特定阈值。确切阈值取决于文字的字体大小以及文字是否以粗体显示:

  • 如果文字小于 18sp,或者如果文字为粗体且小于 14sp,请使用前景颜色和背景颜色,使色彩对比度至少达到 4.5:1。
  • 对于其他所有文字,请将色彩对比度至少设为 3:1。

下图显示了文字与背景色彩对比度的两个示例:

两个示例,显示了彩色背景上的“文字”一词。左侧的示例中,文字与背景之间的色彩对比度较低;右侧的示例中,文字与背景之间的色彩对比度足够高。
图 1. 低于建议的色彩对比度(左图)和足够高的色彩对比度(右图)。

如需查看应用中文字与背景的色彩对比度,请使用在线色彩对比度检查工具或无障碍功能扫描仪应用。

采用大且易用的控件

如果您的应用界面中的控件易于查看和点按,该界面便会更容易使用。对于触控界面,我们建议每个互动式界面元素的可聚焦区域(即触摸目标大小)至少为 48dpx48dp。越大越好。

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

在以下代码段中,通过为小型界面元素提供更大的触摸目标,使其可供访问:

@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)
        )
    }
}

如需详细了解触摸目标尺寸,请参阅触摸目标尺寸下限

描述每个界面元素

应用中的每个界面元素都应包含描述该元素用途的说明。在大多数情况下,您可以在元素的 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)会自动读出文字本身。

向应用的界面元素添加说明时,请牢记以下最佳实践:

  • 使用说明来传达互动的目的和结果,而不是视觉细节。使用 Role 语义属性(例如 Role.ButtonRole.Switch)公开界面元素的类型。这样,屏幕阅读器便能正确读出元素。

  • 避免说明中出现冗余。例如,如果选择某个按钮会导致应用中发生“提交”操作,则将该按钮的说明设为 "Submit",而非 "Submit button"

  • 每条说明都应该是独一无二的。这样,当屏幕阅读器用户遇到重复的元素说明时,他们便能正确地识别出焦点现在位于之前已聚焦的元素上。特别是,列表(如 LazyColumn)中的每一项都应具有不同的说明,每条说明都应反映给定项所特有的内容,例如位置列表中某个城市的名称。

  • 使用 hideFromAccessibility API 标记纯装饰性元素,以便无障碍服务可以忽略它们。如果某个界面元素具有 contentDescription 参数,但纯粹是装饰性元素(例如属于另一个界面元素的 Icon),请传递 null 以避免标签冗余。如需查看更详细的用例,请参阅合并和清除

  • 测试您的代码,确保内容说明按预期传递。 Android Lint、Compose 测试以及手动和自动化测试工具可以标记常见问题并揭示实现中的问题。

其他资源

如需详细了解如何让您的应用使用起来更没有障碍,请参阅下面列出的其他资源:

Codelab

视频

查看内容