操作Java / Android颜色int的字节

如果我在Java中使用一个int作为Android颜色(用于在Canvas上绘图),那么如何操作该int的alpha分量? 例如,我怎样才能使用一个操作来做到这一点:

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

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

查看Color类。

你的代码看起来有点像这样。

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

所以在一个方法中包装它可能看起来像:

 public int adjustAlpha(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类是一个更多的自我logging,只是做自己的位操作,加上它已经为你做了。

另一种方法是:

 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 

在android-support-v4中使用ColorUtils#setAlphaComponent 。

在android-support-v4中。

 int alpha = 85; textView.setBackgroundColor(ColorUtils.setAlphaComponent(Color.Red,alpha)); 

这不是直接回答这个问题,但最好记住View和Drawable有一个setAlpha(float alpha)方法,它可以做你想做的事情。 或者你可能想尝试view.getBackground()。setAlpha()。