Управление альфа-байтами цвета Java / Android int


81

Если у меня есть int в Java, который я использую в качестве цвета 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 (float alpha), который может делать то, что вы хотите. Или вы можете попробовать view.getBackground (). SetAlpha ().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.