我有一个采用给定颜色的功能,我希望它能使颜色变暗(将亮度降低20%左右)。给出一个颜色(int),我无法弄清楚如何做到这一点。什么是正确的方法?
public static int returnDarkerColor(int color){
int darkerColor = ....
return darkerColor;
}
答案 0 :(得分:43)
更多Android方式:
public static int manipulateColor(int color, float factor) {
int a = Color.alpha(color);
int r = Math.round(Color.red(color) * factor);
int g = Math.round(Color.green(color) * factor);
int b = Math.round(Color.blue(color) * factor);
return Color.argb(a,
Math.min(r,255),
Math.min(g,255),
Math.min(b,255));
}
您需要使用小于1.0f
的因子来变暗。试试0.8f
。
答案 1 :(得分:16)
还有一个更简单的解决方案,以前没有提到过,Android有一个名为ColorUtils
的类,可以为您提供帮助
这是扩展功能的Kotlin代码段
inline val @receiver:ColorInt Int.darken
@ColorInt
get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)
方法ColorUtils.blendARGB
将您的颜色作为您要混合的第二个颜色,在这种情况下,black
最终将最后一个参数作为您的颜色和黑色之间的比率您正在融合。
答案 2 :(得分:11)
如果您想要更简单而不准确,下面的内容可能会对您有所帮助。
public static int returnDarkerColor(int color){
float ratio = 1.0f - 0.2f;
int a = (color >> 24) & 0xFF;
int r = (int) (((color >> 16) & 0xFF) * ratio);
int g = (int) (((color >> 8) & 0xFF) * ratio);
int b = (int) ((color & 0xFF) * ratio);
return (a << 24) | (r << 16) | (g << 8) | b;
}
答案 3 :(得分:10)
使用像RogueBaneling这样的HSV的简单解决方案建议:
<强>科特林强>
@ColorInt fun darkenColor(@ColorInt color: Int): Int {
return Color.HSVToColor(FloatArray(3).apply {
Color.colorToHSV(color, this)
this[2] *= 0.8f
})
}
<强>爪哇强>
@ColorInt int darkenColor(@ColorInt int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f;
return Color.HSVToColor(hsv);
}
不需要复杂的按位操作或Math
。如果需要,将0.8f
移动到参数。
答案 4 :(得分:4)
将颜色转换为HSV array,然后将亮度降低20%,然后使用HSVToColor
将HSV阵列转换回RGB。注意:您希望在数组中更改的值为V
- 值。 (即hsv[2]
)
答案 5 :(得分:0)
这样,您可以选择颜色的百分比,从而获取较深或较浅的阴影
` int color = ((ColorDrawable)c2.getBackground()).getColor();
int colorLighter=-color*40/100+color;
int colorDarker=+color*40/100+color; `
colorlighter从按钮的背景为我们提供了较浅的颜色阴影 colordarker为我们提供了按钮背景的深色阴影
答案 6 :(得分:0)
最好的方法是使用 ColorUtils.blendARGB
深色:
val newColor = ColorUtils.blendARGB(this, Color.BLACK, 0.5f)
更轻:
val newColor = ColorUtils.blendARGB(this, Color.WHITE, 0.5f)