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.

jn_pdx
quelle

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.

Majormajors
quelle
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
58

in der android-support-v4 :

int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);
Masoud Siahkali
quelle
2
Dies ist die richtige Antwort, keine Notwendigkeit, diese Logik neu zu schreiben
Patrick Favre
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
Ratata Tata
quelle
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.

Miguel
quelle