Manipuluj bajtami alfa koloru Java / Android int


82

Jeśli mam int w Javie, którego używam jako koloru Androida (do rysowania na kanwie), jak mogę manipulować tylko składnikiem alfa tego int? Na przykład, jak mogę użyć operacji, aby to zrobić:

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

W idealnym przypadku byłoby miło pomnożyć te pierwsze bajty przez factorto, co jest, zamiast po prostu ustawić bajty na wartość statyczną.

Odpowiedzi:


176

Sprawdź klasę Color .

Twój kod wyglądałby mniej więcej tak.

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

Tak więc zawinięcie go w metodę może wyglądać następująco:

@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);
}

A potem nazwij to, aby ustawić przezroczystość na, powiedzmy, 50%:

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

Myślę, że użycie dostarczonej klasy Color jest trochę bardziej samodokumentujące niż samodzielne robienie trochę manipulacji, a ponadto jest to już zrobione za Ciebie.


47
ColorUtils.setAlphaComponent()robi dokładnie to
Patrick Favre

12
Masz rację, ColorUtilsto teraz jest właściwa droga, ale ta klasa nie istniała, kiedy pisałem tę odpowiedź.
majormajors



39

Alternatywą jest:

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

Lub używając float:

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

Możesz zmienić dowolny kanał, zmieniając wartość bitową 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

To nie jest bezpośrednią odpowiedzią na pytanie, ale dobrze jest pamiętać, że View i Drawable mają metodę setAlpha (float alpha), która może zrobić to, co chcesz. Lub możesz spróbować view.getBackground (). SetAlpha ().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.