特定の色を取る関数があり、色を暗くしたい(明るさを20%程度下げる)。色(int)のみを指定してこれを行う方法を理解できません。適切なアプローチは何ですか?
public static int returnDarkerColor(int color){
int darkerColor = ....
return darkerColor;
}
もっと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
をお試しください。
これまでに説明されていない簡単な解決策もあります。AndroidにはColorUtils
というクラスがあります。これは、拡張関数のKotlinスニペットです。
inline val @receiver:ColorInt Int.darken
@ColorInt
get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)
メソッドColorUtils.blendARGB
は、ブレンドする最初のパラメーターと2番目のパラメーターとして色を使用します。この場合はblack
で、最後に、最後のパラメーターは、ブレンドするカラーと黒色の比率です。
RogueBanelingのようなHSVを使用したより簡単なソリューションは、次のことを提案しています。
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
必要に応じて引数に。
より単純で正確ではない場合は、以下を参考にしてください。
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;
}
色を HSV配列 に変換し、明るさを20%削減してから、HSV配列をHSVToColor
を使用してRGBに変換します。注:配列で変更しようとしている値は、V
- valueです。 (つまり、hsv[2]
)
このようにして、色のパーセンテージを選択して、暗い色合いまたは明るい色合いを取得できます。
` int color = ((ColorDrawable)c2.getBackground()).getColor();
int colorLighter=-color*40/100+color;
int colorDarker=+color*40/100+color; `
colorlighterはボタンの背景から明るい色合いを提供しますcolordarkerはボタンの背景から暗い色合いを提供します