Manipular bytes alfa de color int de Java / Android


81

Si tengo un int en Java que estoy usando como un color de Android (para dibujar en un Canvas), ¿cómo manipulo solo el componente alfa de ese int? Por ejemplo, ¿cómo puedo usar una operación para hacer esto?

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

Idealmente, sería bueno multiplicar esos primeros bytes por lo que factorsea, en lugar de simplemente establecer los bytes en un valor estático.

Respuestas:


175

Mira la clase de Color .

Su código se parecería un poco a esto.

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

Entonces, envolverlo en un método podría verse así:

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

Y luego llámalo para establecer la transparencia en, digamos, 50%:

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

Creo que usar la clase Color proporcionada es un poco más autodocumentado que simplemente hacer la manipulación de bits usted mismo, además, ya está hecho para usted.


46
ColorUtils.setAlphaComponent()hace exactamente esto
Patrick Favre

11
Tienes razón, esa ColorUtilses la manera correcta ahora, pero esa clase no existía cuando escribí esta respuesta.
majormajors



39

Una alternativa es:

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

O usando flotador:

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

Puede cambiar cualquier canal cambiando el valor bit a bit 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

Esto no responde directamente a la pregunta, pero es bueno recordar que View y Drawable tienen un método setAlpha (float alpha) que puede hacer lo que quieras. O tal vez desee probar view.getBackground (). SetAlpha ().

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.