Управление альфа-байтами цвета 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.