【问题标题】:Create color value dynamically动态创建颜色值
【发布时间】:2022-11-19 04:57:40
【问题描述】:

我的应用程序根据登录用户显示按钮。

应用程序的详细信息和条件:

  • 将显示的按钮数量未知(可能是 1、20、100 等)
  • 必须为每个按钮设置不同的颜色
  • 我想要对颜色值进行一些控制,因为文本始终为白色,因此文本必须始终可读

如何在这些条件下创建动态颜色值?

【问题讨论】:

  • This 会有所帮助
  • 谢谢!那里有很多阅读和尝试,那里应该有一个解决方案

标签: android kotlin accessibility


【解决方案1】:

首先,您需要确定文本的“可读性”程度。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中减去太多之前,它应该总是返回一个有效的颜色 -这只是一个简单的例子)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多