2013-03-10 8 views
49

Se ho un int in Java che sto usando come un colore Android (per disegnare su una tela), come faccio a manipolare solo il componente alfa di quella int? Per esempio, come posso utilizzare un'operazione per fare questo:Manipolare i byte alfa di Java/Android int colore

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

Idealmente, sarebbe bello moltiplicare quei primi byte con qualsiasi factor è, piuttosto che impostare i byte per un valore statico.

risposta

126

Verificare la classe Color.

Il tuo codice sembrerebbe un po 'simile a questo.

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

Così avvolgendolo in un metodo potrebbe essere simile:

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

E poi chiamare per impostare la trasparenza di, diciamo, 50%:

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

penso utilizzando la classe Color fornita è un po 'più autodocumentante che fa solo la manipolazione del bit da solo, in più è già fatta per te.

+1

'ColorUtils.setAlphaComponent()' fa esattamente questo – for3st

34

Un'alternativa è:

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

o utilizzando float:

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

È possibile modificare qualsiasi canale cambiando il valore bit a 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 
1

Questo non risponde direttamente alla domanda, ma è bene ricordare che Vista e Drawable hanno un metodo di setAlpha (float alfa) che potrebbero fare quello che vuoi. O potresti voler provare view.getBackground(). SetAlpha().

15

nel android-support-v4:

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

Questa è la risposta corretta, non c'è bisogno di riscrivere questa logica – for3st