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.