Получите более темный цвет по фактору, учитывая цвет Int
Вот как я получаю более светлый цвет с учетом int. Но мне интересно, как я могу преобразовать это, чтобы дать мне более темный цвет?
Как мне изменить метод ниже, чтобы получить более темный цвет?
public static int getLighterColorByValue(int color, float factor) {
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
return Color.argb(Color.alpha(color), red, green, blue);
}
1 ответ
Учитывая только красный канал (поскольку логика для остальных идентична):
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
Вы рассчитываете взвешенную сумму между текущим красным каналом и 255 (полная интенсивность). В упрощенном виде:
int newRed = (1 - factor) * oldRed + factor * 255;
Итак, вместо смешивания с полной интенсивностью, смешайте с нулевой интенсивностью:
int newRed = (1 - factor) * oldRed + factor * 0;
или, проще:
int newRed = (1 - factor) * oldRed;
Итак, используя формат вашего исходного кода, просто бросьте + factor
:
int red = (int) ((Color.red(color) * (1 - factor) / 255) * 255);
Но с тех пор 1 - factor
это float
деление на 255 и умножение на 255 возвращает вас к тому же числу снова. Итак, проще:
int red = (int) ((Color.red(color) * (1 - factor));
int green = (int) ((Color.green(color) * (1 - factor));
int blue = (int) ((Color.blue(color) * (1 - factor));
Санитарная проверка:
- Если
factor == 0
новый цвет совпадает с исходным цветом - Это
factor == 1
,(1 - factor) == 0
, такred == green == blue == 0
новый цвет черный.