Java / Android colorintのアルファバイトを操作します


81

Androidカラー(Canvasでの描画用)として使用しているJavaのintがある場合、そのintのアルファコンポーネントのみを操作するにはどうすればよいですか?たとえば、これを行うために操作を使用するにはどうすればよいですか?

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

理想的にfactorは、バイトを静的な値に設定するのではなく、最初のバイトに何でも乗算するとよいでしょう。

回答:


175

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クラスを使用することは、ビット操作を自分で行うよりも少し自己文書化されていると思います。さらに、それはすでに行われています。


46
ColorUtils.setAlphaComponent()まさにこれを行う
Patrick Favre 2018

11
あなたは正しいColorUtilsです、それは今正しい方法です、しかし私がこの答えを書いたときそのクラスは存在しませんでした。
majormajors



39

別の方法は次のとおりです。

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()を試してみることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.