Bearbeiten Sie Alpha-Bytes der Java / Android-Farbe int


80

Wenn ich ein Int in Java habe, das ich als Android-Farbe verwende (zum Zeichnen auf einer Leinwand), wie kann ich nur die Alpha-Komponente dieses Int bearbeiten? Wie kann ich zum Beispiel eine Operation verwenden, um dies zu tun:

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

Im Idealfall wäre es schön, diese ersten Bytes mit dem zu multiplizieren, was sie factorsind, anstatt nur die Bytes auf einen statischen Wert zu setzen.

Antworten:


175

Überprüfen Sie die Farbklasse .

Ihr Code würde ungefähr so ​​aussehen.

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

Das Einwickeln in eine Methode könnte also folgendermaßen aussehen:

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

Rufen Sie es dann auf, um die Transparenz auf beispielsweise 50% einzustellen:

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

Ich denke, die Verwendung der bereitgestellten Farbklasse ist ein bisschen selbstdokumentierender, als nur die Bitmanipulation selbst durchzuführen, und sie ist bereits für Sie erledigt.


46
ColorUtils.setAlphaComponent()macht genau das
— Patrick Favre

11
Sie haben Recht, das ColorUtilsist jetzt der richtige Weg, aber diese Klasse gab es nicht, als ich diese Antwort schrieb.
— Majormajors



39

Eine Alternative ist:

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

Oder mit float:

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

Sie können jeden Kanal ändern, indem Sie den bitweisen Wert ändern 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

Dies beantwortet die Frage nicht direkt, aber es ist gut zu bedenken, dass View und Drawable eine setAlpha-Methode (float alpha) haben, die möglicherweise das tut, was Sie wollen. Oder Sie möchten view.getBackground (). SetAlpha () ausprobieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.