Маніпулювати альфа-байтами кольорів Java / Android int


81

Якщо у мене в Java є int, який я використовую як колір Android (для малювання на полотні), як я маніпулюю лише альфа-компонентом цього int? Наприклад, як я можу використовувати операцію для цього:

int myOpaqueColor = 0xFFFFFF;
float factor = 0;
int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor);
//myTransparentColor should now = 0x00FFFFFF;

В ідеалі було б непогано помножити ці перші байти на все, що factorє, а не просто встановити байтам статичне значення.

Відповіді:


175

Перевірте клас Color .

Ваш код буде виглядати приблизно так.

int color = 0xFFFFFFFF;
int transparent = Color.argb(0, Color.red(color), Color.green(color), Color.blue(color));

Тож обгортання його методом може виглядати так:

@ColorInt
public static int adjustAlpha(@ColorInt int color, float factor) {
    int alpha = Math.round(Color.alpha(color) * factor);
    int red = Color.red(color);
    int green = Color.green(color);
    int blue = Color.blue(color);
    return Color.argb(alpha, red, green, blue);
}

А потім зателефонуйте йому, щоб встановити прозорість, скажімо, 50%:

int halfTransparentColor = adjustAlpha(0xFFFFFFFF, 0.5f);

Я думаю, що використання наданого класу Color - це трохи більше самодокументування, ніж просто маніпулювання бітами самостійно, плюс це вже зроблено для вас.


46
ColorUtils.setAlphaComponent()робить саме це
Патрік Фавр

11
Ви маєте рацію, що ColorUtilsзараз правильний шлях, але цього класу не було, коли я писав цю відповідь.
majormajors



39

Альтернативою є:

int myOpaqueColor = 0xffffffff;
byte factor = 20;// 0-255;
int color = ( factor << 24 ) | ( myOpaqueColor & 0x00ffffff );

Або за допомогою float:

int myOpaqueColor = 0xffffffff;
float factor = 0.7f;// 0-1;
int color = ( (int) ( factor * 255.0f ) << 24 ) | ( myOpaqueColor & 0x00ffffff);

Ви можете змінити будь-який канал, змінивши побітове значення 24.

public final static byte ALPHA_CHANNEL = 24;
public final static byte RED_CHANNEL   = 16;
public final static byte GREEN_CHANNEL =  8;
public final static byte BLUE_CHANNEL  =  0;

// using:
byte red   = 0xff;
byte green = 0xff;
byte blue  = 0xff;
byte alpha = 0xff;
int color = ( alpha << ALPHA_CHANNEL ) | ( red << RED_CHANNEL ) | ( green << GREEN_CHANNEL ) | ( blue << BLUE_CHANNEL );// 0xffffffff

1

Це не відповідає безпосередньо на запитання, але варто пам’ятати, що View та Drawable мають метод setAlpha (плаваючий альфа), який може робити те, що ви хочете. Або ви можете спробувати view.getBackground (). SetAlpha ().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.