在 Android 中使用 color and color.darker?

2022-08-31 15:28:20

好的,所以我的应用程序中有一个整数变量。它是颜色的值,由我的首选项中的颜色选择器设置。现在,我需要同时使用该颜色和任何颜色的较暗版本。

现在我知道在标准的Java中有一个Color.darker()方法,但在Android中似乎没有等效的方法。有没有人知道等效或任何解决方法?


答案 1

我认为,最简单的方法是转换为HSV,在那里做变暗,然后转换回来:

float[] hsv = new float[3];
int color = getColor();
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f; // value component
color = Color.HSVToColor(hsv);

为了减轻负担,一个简单的方法可能是将值分量乘以>1.0。但是,您必须将结果钳制到 [0.0, 1.0] 范围内。此外,简单地乘法不会使黑色变亮。

因此,更好的解决方案是:将值分量的差从 1.0 减小到更轻:

hsv[2] = 1.0f - 0.8f * (1.0f - hsv[2]);

这与变暗的方法完全平行,只是使用1作为原点而不是0。它可以减轻任何颜色(甚至是黑色),并且不需要任何夹紧。它可以简化为:

hsv[2] = 0.2f + 0.8f * hsv[2];

但是,由于浮点算术的可能舍入效应,我担心结果可能会超过1.0f(可能超过一位)。最好坚持稍微复杂一点的公式。


答案 2

以下是我创建的内容:

/**
 * Returns darker version of specified <code>color</code>.
 */
public static int darker (int color, float factor) {
    int a = Color.alpha( color );
    int r = Color.red( color );
    int g = Color.green( color );
    int b = Color.blue( color );

    return Color.argb( a,
            Math.max( (int)(r * factor), 0 ),
            Math.max( (int)(g * factor), 0 ),
            Math.max( (int)(b * factor), 0 ) );
}