【发布时间】:2022-11-19 04:57:40
【问题描述】:
我的应用程序根据登录用户显示按钮。
应用程序的详细信息和条件:
- 将显示的按钮数量未知(可能是 1、20、100 等)
- 必须为每个按钮设置不同的颜色
- 我想要对颜色值进行一些控制,因为文本始终为白色,因此文本必须始终可读
如何在这些条件下创建动态颜色值?
【问题讨论】:
-
This 会有所帮助
-
谢谢!那里有很多阅读和尝试,那里应该有一个解决方案
标签: android kotlin accessibility
我的应用程序根据登录用户显示按钮。
应用程序的详细信息和条件:
如何在这些条件下创建动态颜色值?
【问题讨论】:
标签: android kotlin accessibility
首先,您需要确定文本的“可读性”程度。WCAG 2.1是可访问性要求的通用标准,其最小对比度要求是4.5:1. (规范定义是here,或者为了更简单的概述和一些很好的例子,this。)
这种对比度将保证您的文本可以被“中度低视力”的人阅读。3:1推荐用于“标准文本和标准视觉”,但我总是建议使用可访问的比率 - 特别是因为您使用的是白色和随机颜色,这在可读性方面会有很大差异!
WCAG 2.1也允许3:1比率大号文字, 这是18pt或者14pt 粗体.结果大约是40dp对于常规文本和31dp大胆。也取决于字体,而且因为你经常使用sp相反,用户可以控制字体的大小,因此会使事情复杂化。但基本上,大文本 = 较低的对比度要求
现在你有了对比度,你可以检查你的颜色组合是否符合它。 ColorUtils 中有一个很好的工具可以为你做这件事——它使用WCAG对比度计算公式:
fun meetsMinContrast(@ColorInt foreground: Int, @ColorInt background: Int): Boolean {
val minContrast = 4.5
val actual = ColorUtils.calculateContrast(foreground, background)
return actual >= minContrast
}
至于实际生成颜色,我不知道这样做的“聪明”方法,如果有的话 - 当与白色配对时,您可能会生成有效颜色的颜色空间,然后从中选择,但我不知道真的对此一无所知-也许其他人可以提出更好的解决方案!
所以对于一个纯粹天真的随机方法:
val colours = generateSequence {
Color.valueOf(
Random.nextInt(0, 255),
Random.nextInt(0, 255),
Random.nextInt(0, 255)
)
}
val accessibleBackgrounds = colours.filter { background ->
meetsMinContrast(Color.WHITE, background)
}
然后你有一系列有效的、随机的颜色,你可以在你的按钮上设置。
如果你不喜欢“一直随机生成直到你找到一个有效的方法”的方法(这很老套,如果你运气不好的话可能会很慢),你可以改用 HSV:
fun getAccessibleBackground(): Color {
val hsv = floatArrayOf(
Random.nextFloat() * 360f,
Random.nextFloat(),
Random.nextFloat()
)
var colour: Color
while(true) {
colour = Color.HSVtoColor(hsv)
if (meetsMinContrast(Color.WHITE, colour)) return colour
// darken the colour a bit (subtract 1% value) and try again
hsv[2] -= 0.01f
}
}
(我会更明确地说明错误检查并在那里提供后备,特别是如果你让它与前景颜色参数一起工作,但在你需要担心从value中减去太多之前,它应该总是返回一个有效的颜色 -这只是一个简单的例子)
【讨论】: