操纵Java / Android color int的alpha字节


80

如果我在Java中有一个int用作Android颜色(用于在Canvas上绘制),我该如何操作该int的alpha分量?例如,如何使用操作来做到这一点:

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

理想情况下,最好将第一个字节乘以任何factor值,而不是仅将字节设置为静态值。

Answers:


172

查看Color类。

您的代码看起来像这样。

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

因此,将其包装在方法中可能类似于:

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

然后调用它以将透明度设置为50%:

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

我认为使用提供的Color类比直接自己进行位操作多了一些自我说明,而且它已经为您完成了。


43
ColorUtils.setAlphaComponent()正是这样做的
帕特里克·法弗

10
您说得对,这ColorUtils是正确的方法,但是当我编写此答案时,该类并不存在。
majormajors



38

一种替代方法是:

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

或使用float:

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

您可以通过更改按位值来更改任何通道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

这并不是直接回答问题,但是要记住,View和Drawable具有setAlpha(float alpha)方法,该方法可能会执行您想要的操作。或者,您可能想尝试view.getBackground()。setAlpha()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.