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

81

Если у меня есть int в Java, который я использую в качестве цвета Android (для рисования на холсте), как мне управлять только альфа-компонентом этого int? Например, как я могу использовать операцию для этого:

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

В идеале было бы неплохо умножить эти первые байты на то factor, что есть, а не просто устанавливать байты на статическое значение.

jn_pdx
источник

Ответы:

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 немного более самодокументируется, чем просто выполнение битовых манипуляций самостоятельно, плюс это уже сделано за вас.

Majormajors
источник
46
ColorUtils.setAlphaComponent()делает именно это
Патрик Фавр
11
Вы правы, ColorUtilsэто правильный путь, но этого класса не существовало, когда я писал этот ответ.
majormajors
59

в android-support-v4 :

int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);
Масуд Сиахкали
источник
2
Это правильный ответ, не нужно переписывать эту логику
Патрик Фавр
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 ().

Мигель
источник