web-dev-qa-db-fra.com

Manipuler les octets alpha de Java / Android color int

Si j'ai un int dans Java que j'utilise comme couleur Android (pour dessiner sur un canevas), comment puis-je manipuler uniquement le composant alpha Par exemple, comment puis-je utiliser une opération pour ce faire:

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

Idéalement, il serait agréable de multiplier ces premiers octets par ce que factor est, plutôt que de simplement mettre les octets à une valeur statique.

66
jn_pdx

Découvrez la classe Couleur .

Votre code ressemblerait un peu à ceci.

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

Donc, l'envelopper dans une méthode pourrait ressembler à:

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

Et puis appelez-le pour définir la transparence à, disons, 50%:

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

Je pense que l'utilisation de la classe Color fournie est un peu plus auto-documentée que la simple manipulation du bit, et c'est déjà fait pour vous.

157
majormajors

Utilisez ColorUtils # setAlphaComponent dans Android-support-v4.

65
chenupt

dans le Android-support-v4 :

int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);
41
Masoud Siahkali

Une alternative est:

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

Ou en utilisant float:

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

Vous pouvez modifier n'importe quel canal en modifiant la valeur au niveau du 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
36
Ratata Tata

Cela ne répond pas directement à la question, mais il est bon de se rappeler que View et Drawable ont une méthode setAlpha (float alpha) qui pourrait faire ce que vous voulez. Ou vous voudrez peut-être essayer view.getBackground (). SetAlpha ().

1
miguel