Для этого есть как минимум два достойных решения: одно лучше (в любом случае, более «правильное»), чем другое. Это зависит от того, для чего вы хотите использовать цвет или от короткого и простого кода.
Использование цветового пространства, моделирующего яркость
Проблема в том, что ваши цвета, вероятно, определены как RGB (т. Е. Количество красного, зеленого и синего, отражающих ваш монитор.) Лучший способ изменить яркость цвета - это указать цвета в другом цветовом пространстве, где яркость равна один компонент, такой как HSB - оттенок («цвет»), насыщенность («количество» цвета) и яркость (понятно, я думаю!)
Эта статья в Википедии о цветовых моделях HSL и HSV объясняет гораздо больше, чем вы, вероятно, хотите знать:)
Взгляните на эту демонстрацию HSB .
Дело в том, что, как только ваши цвета указаны в другом пространстве, где один компонент является яркостью, изменение яркости становится легким, потому что вы можете увеличивать или уменьшать этот компонент по своему желанию, так же, как вы можете увеличивать или уменьшать величину синего цвета в цвете RGB. Я думаю, что в Java встроены некоторые функции преобразования цвета - некоторые из них нашли на этой странице в поисках удобного примера Color.RGBtoHSB()
и снова вернулись с Color.HSBtoRGB
.
Смешивание с белым или черным
Это хакерский, но эффективный в большинстве ситуаций, и большинство написанного мною кода, которому нужно получить две версии цвета (например, для градиента) для чего-то неважного, такого как фон пользовательского интерфейса, использует такой метод. Логика заключается в том, что цвет будет ярче по мере приближения к белому (RGB 255,255,255) и темнее по мере приближения к черному (RGB 0,0,0). Так что, чтобы что-то осветлить, смешайте с белым, скажем, на 25%. Вы можете смешивать два цвета, беря пропорцию одного цвета и обратную пропорцию другого для каждого канала / компонента.
Следующее не проверено и представляет собой преобразование кода Delphi, который я использовал для того же (код взят из памяти, и, кроме того, я годами не использовал Java и не помню синтаксис и классы хорошо, так что я не ожидаю, что это скомпилируется, но вы должны быть в состоянии понять):
Color Blend(Color clOne, Color clTwo, float fAmount) {
float fInverse = 1.0 - fAmount;
// I had to look up getting colour components in java. Google is good :)
float afOne[] = new float[3];
clOne.getColorComponents(afOne);
float afTwo[] = new float[3];
clTwo.getColorComponents(afTwo);
float afResult[] = new float[3];
afResult[0] = afOne[0] * fAmount + afTwo[0] * fInverse;
afResult[1] = afOne[1] * fAmount + afTwo[1] * fInverse;
afResult[2] = afOne[2] * fAmount + afTwo[2] * fInverse;
return new Color (afResult[0], afResult[1], afResult[2]);
}
И вы, вероятно, использовали бы это как:
Color clBrighter = Blend(Color.red, Color.white, 0.25);
Возможно, вы захотите добавить некоторый код безопасности, например, обеспечить зажим между 0..255 для каждого компонента или проверить, что dAmount
действительно находится в диапазоне 0..1.
Документация Java Color выглядит так, как будто класс Color
содержит все виды полезных методов. (Редактировать: я только что заметил, что вы сказали, что используете gwt
, а не awt
- я не использовал его и не знаю, какие классы из стандартной Java включены. Это должно указать вам правильное направление в любом случае.) Это Возможно, это не самый чистый путь в Java - это будет связано с тем, что в эти дни у меня недостаточно знаний о классах и методах, - но этого должно быть достаточно, чтобы помочь вам в этом. Надеюсь, это поможет!