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ą.

jn_pdx
źródło

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.

majormajors
źródło
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
59

w android-support-v4 :

int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);
Masoud Siahkali
źródło
2
To jest prawidłowa odpowiedź, nie ma potrzeby przepisywania tej logiki
Patrick Favre
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
Ratata Tata
źródło
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 ().

miguel
źródło