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.

jn_pdx
fuente

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.

mayores
fuente
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
59

en android-support-v4 :

int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);
Masoud Siahkali
fuente
2
Esta es la respuesta correcta, no es necesario reescribir esta lógica
Patrick Favre
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
Ratata Tata
fuente
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 ().

miguel
fuente