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

问题描述 投票:0回答:6

如果我在 Java 中有一个 int 用作 Android 颜色(用于在 Canvas 上绘图),我该如何操作该 int 的 alpha 分量?例如,我如何使用操作来执行此操作:

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

理想情况下,最好将这些第一个字节乘以

factor
的值,而不是仅仅将字节设置为静态值。

java android bit-manipulation
6个回答
195
投票

查看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 类比自己进行位操作更具自我记录性,而且它已经为您完成了。


89
投票

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


78
投票

android-support-v4 中:

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

40
投票

替代方案是:

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

或使用浮动:

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()。


0
投票

如果您使用 Kotlin,您现在可以复制颜色来修改其属性:

val modifiedColor = myColor.copy(alpha = 0.5f)
© www.soinside.com 2019 - 2024. All rights reserved.