跳转到正文
YGJoon
返回

Android Kotlin Compose 可访问性与无障碍

编辑文章

可访问性目标

语义描述

@Composable
fun AccessibleButton(onClick: () -> Unit, enabled: Boolean) {
    Button(
        onClick = onClick,
        enabled = enabled,
        modifier = Modifier.semantics {
            contentDescription = "提交订单"
            stateDescription = if (enabled) "可点击" else "不可用"
        }
    ) {
        Text("提交")
    }
}

隐藏内容

Modifier.clearAndSetSemantics { }

焦点导航

val focusRequester = remember { FocusRequester() }

LaunchedEffect(Unit) {
    focusRequester.requestFocus()
}

TextField(
    value = text,
    onValueChange = { text = it },
    modifier = Modifier
        .focusRequester(focusRequester)
        .focusProperties { next = FocusRequester.Default }
)

动态字体与布局

val fontScale = LocalDensity.current.fontScale
val adaptivePadding = 16.dp * fontScale

Text(
    text = title,
    modifier = Modifier.padding(horizontal = adaptivePadding)
)

色彩对比

MaterialTheme(colorScheme = dynamicColorScheme(context)) {
    // composables
}

TalkBack 交互

场景处理方式
分页内容PagerState + announce 当前页
动画提示使用 Snackbar 或 announceForAccessibility
手势操作提示提供 contentDescription 说明
val context = LocalContext.current
LaunchedEffect(selectedTab) {
    context.getSystemService(AccessibilityManager::class.java)
        ?.let { manager ->
            if (manager.isEnabled) {
                manager.interrupt()
                manager.sendAccessibilityEvent(AccessibilityEvent.obtain().apply {
                    eventType = AccessibilityEvent.TYPE_ANNOUNCEMENT
                    text.add("切换到第${selectedTab + 1}个标签")
                })
            }
        }
}

辅助技术调试

常见问题

问题原因解决方案
TalkBack 报读错误缺少语义描述或描述不准确使用 semantics { contentDescription = ... }
焦点丢失动态视图未设置焦点顺序使用 focusProperties、focusRequester
对比度不足自定义颜色亮度不足调整色值或启用高对比模式

总结

  1. Compose 提供语义树,合理设置 semantics 可大幅提升无障碍体验。
  2. 关注字体缩放、对比度与焦点导航,确保用户在不同环境下都能顺畅操作。
  3. 将无障碍检查纳入测试流程,持续优化,使应用符合行业法规与用户期望。

编辑文章
分享这篇文章:

上一篇
Android Kotlin Compose 导航与深链
下一篇
Android Kotlin Compose 动画进阶