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.