2013-03-10 1 views
49

Wenn ich ein int in Java habe, das ich als eine Androidfarbe verwende (für das Zeichnen auf einem Segeltuch), wie manipuliere ich gerade die Alphakomponente dieses int? Zum Beispiel: Wie kann ich eine Operation, dies zu tun:Alphabytes von Java-/Androidfarbe manipulieren Int

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

Idealerweise wäre es schön, dieses erste Bytes zu multiplizieren, was auch immer factor ist, und nicht nur das Bytes auf einen statischen Wert gesetzt.

Antwort

126

Überprüfen Sie die Color Klasse.

Ihr Code würde ein bisschen so aussehen.

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

Einwickeln es also in einem Verfahren aussehen könnte:

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

Und dann, um die Transparenz zu setzen nennen, sagen wir mal, 50%:

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

Ich denke, mit Die bereitgestellte Color-Klasse ist ein bisschen selbstdokumentierender, dass Sie die Bit-Manipulation selbst machen, und es ist bereits für Sie erledigt.

+1

'ColorUtils.setAlphaComponent()' tut genau dies – for3st

34

Eine Alternative ist:

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

Oder Verwendung 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 die bitweise 24 Werte ändern.

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

sich die Frage nicht direkt beantworten, aber es ist gut, dass die Ansicht und Drawable eine setAlpha (float alpha) Methode zu erinnern, die tun könnte, was Sie wollen. Oder versuchen Sie es mit view.getBackground(). SetAlpha().

15

im android-support-v4:

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

Das ist die richtige Antwort, keine Notwendigkeit, diese Logik zu umschreiben – for3st