操纵Java/Android color int的alpha字节

jn_*_*pdx 69 java android bit-manipulation

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

int myOpaqueColor = 0xFFFFFF;
float factor = 0;
int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor);
//myTransparentColor should now = 0x00FFFFFF;
Run Code Online (Sandbox Code Playgroud)

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

maj*_*ors 162

查看Color类.

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

int color = 0xFFFFFFFF;
int transparent = Color.argb(0, Color.red(color), Color.green(color), Color.blue(color));
Run Code Online (Sandbox Code Playgroud)

因此将其包装在方法中可能如下所示:

@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);
}
Run Code Online (Sandbox Code Playgroud)

然后调用它来设置透明度,比方说,50%:

int halfTransparentColor = adjustAlpha(0xFFFFFFFF, 0.5f);
Run Code Online (Sandbox Code Playgroud)

我认为使用提供的Color类有点自我记录,只是自己进行位操作,而且已经为你完成了.

  • `ColorUtils.setAlphaComponent()`正是这样做的 (25认同)
  • 你说'ColorUtils`是正确的方法你是对的,但是当我写这个答案时,那个类并不存在. (6认同)

che*_*upt 67

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

  • 截至 2021 年,在“androidx.core.graphics.ColorUtils”中。 (4认同)

Mas*_*ali 43

android-support-v4中:

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

  • 这是正确答案,无需重写此逻辑 (2认同)

Rat*_*ata 37

另一种选择是:

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

或者使用float:

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

您可以通过更改按位值来更改任何通道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
Run Code Online (Sandbox Code Playgroud)