操纵Java/Android颜色int的alpha字节

操纵Java/Android颜色int的alpha字节,java,android,bit-manipulation,Java,Android,Bit Manipulation,如果我在Java中使用了一个int作为Android颜色(用于在画布上绘制),那么如何操作该int的alpha组件呢?例如,如何使用操作来执行此操作: int myOpaqueColor = 0xFFFFFF; float factor = 0; int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor); //myTransparentColor should now = 0x00FFFFFF;

如果我在Java中使用了一个int作为Android颜色(用于在画布上绘制),那么如何操作该int的alpha组件呢?例如,如何使用操作来执行此操作:

int myOpaqueColor = 0xFFFFFF;
float factor = 0;
int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor);
//myTransparentColor should now = 0x00FFFFFF;
理想情况下,最好将这些第一个字节乘以
因子,而不是将字节设置为静态值。

查看该类

您的代码看起来有点像这样

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);
我认为使用提供的颜色类比自己进行位操作更能自我记录,而且已经为您完成了操作。

另一种选择是:

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

这并不是直接回答这个问题,但最好记住View和Drawable有一个setAlpha(float alpha)方法,可以实现您想要的功能。或者您可能希望尝试在android-support-v4中使用view.getBackground().setAlpha()。

在以下位置使用:


这是正确的答案,无需重写此逻辑
ColorUtils。setAlphaComponent()
正是这样做的您是对的
ColorUtils
现在是正确的方式,但在我编写此答案时该类不存在。
int myOpaqueColor = 0xffffffff;
float factor = 0.7f;// 0-1;
int color = ( (int) ( factor * 255.0f ) << 24 ) | ( myOpaqueColor & 0x00ffffff);
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
int alpha = 85; //between 0-255
@ColorInt
int alphaColor = ColorUtils.setAlphaComponent(Color.Red, alpha);