android 如何使给定颜色变暗(int)

6pp0gazn  于 2022-12-25  发布在  Android
关注(0)|答案(8)|浏览(190)

我有一个函数,它接受一个给定的颜色,我想让它变暗颜色(减少亮度20%左右)。我不知道如何做到这一点,只有一个颜色(int)。什么是正确的方法?

public static int returnDarkerColor(int color){
    int darkerColor = .... 
    return darkerColor;
}
dvtswwa3

dvtswwa31#

一种更像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

eyh26e7m

eyh26e7m2#

甚至还有一个之前没有提到过的更简单的解决方案,Android有一个名为ColorUtils的类,这是一个扩展函数的Kotlin片段,可以帮助您解决这个问题

inline val @receiver:ColorInt Int.darken
    @ColorInt
    get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)

ColorUtils.blendARGB方法把你的颜色作为第一个参数,第二个是你想要混合的颜色,在这里是black,最后一个参数是你的颜色和你要混合的黑色的比例.

oprakyz7

oprakyz73#

一个更简单的解决方案使用HSV像RogueBaneling建议:

    • Kotlin**
@ColorInt fun darkenColor(@ColorInt color: Int): Int {
    return Color.HSVToColor(FloatArray(3).apply {
        Color.colorToHSV(color, this)
        this[2] *= 0.8f
    })
}
    • java **
@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移到参数。

bwitn5fc

bwitn5fc4#

如果你想更简单和不准确,下面可能会帮助你。

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;
}
1sbrub3j

1sbrub3j5#

使用ColorUtils.blendARGB的最佳方法

较暗:

val newColor = ColorUtils.blendARGB(this, Color.BLACK, 0.5f)

打火机:

val newColor = ColorUtils.blendARGB(this, Color.WHITE, 0.5f)
g9icjywg

g9icjywg6#

将颜色转换为HSV阵列,然后将亮度降低20%,然后使用HSVToColor将HSV阵列转换回RGB。您希望在数组中更改的值将是V值。(即hsv[2]

lbsnaicq

lbsnaicq7#

这样你可以选择颜色的百分比,从而获取一个阴影更深或阴影更轻

int  color = ((ColorDrawable)c2.getBackground()).getColor();
int  colorLighter = color - color * 40/100;
int  colorDarker = color + color * 40/100;

colorlighter为按钮的背景提供一个较浅的颜色阴影colorderdark为按钮的背景提供一个较深的颜色阴影

mlnl4t2r

mlnl4t2r8#

基于@Rasoul Miri的答案,你可以用一种更加 kotlinic 的方式为你的主颜色类创建扩展。例如,如果使用Android中androidx.compose.ui.graphics.Color包中的颜色类,你可以用这种方式为它添加一些扩展:

fun Color.lighter(factor: Float = 1f) =
  Color(ColorUtils.blendARGB(this.toArgb(), Color.White.toArgb(), factor))

fun Color.darker(factor: Float = 1f) =
  Color(ColorUtils.blendARGB(this.toArgb(), Color.Black.toArgb(), factor))

这是一个非常小的函数,只需执行以下操作即可使用

val myNewLighterColor = MaterialTheme.colors.primary.lighter(0.5f)
val myNextDarkerColor = MaterialTheme.colors.primary.darker(0.5f)

相关问题