2016-01-06 2 views
1

Вот как я получаю светлый цвет с учетом 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); 
} 

ответ

2

Рассматривая только красный канал (так как логика для других идентична):

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)); 

Sanity проверка:

  • Если factor == 0, новый цвет такой же, как первоначальный цвет
  • Это factor == 1, (1 - factor) == 0, так red == green == blue == 0, т.е. новый цвет черный.
+0

Удивительный! работает так, как должно. – Tuby

Смежные вопросы