Java / Android color int의 알파 바이트 조작


81

Android 색상 (캔버스에 그리기 위해)으로 사용중인 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()바로 이러한이
패트릭 파브르

11
당신 말이 맞아요 ColorUtils.하지만 제가이 대답을 썼을 때 그 수업은 존재하지 않았습니다.
majormajors



39

대안은 다음과 같습니다.

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

1

이것은 질문에 직접 답하는 것은 아니지만 View와 Drawable에는 원하는 작업을 수행 할 수있는 setAlpha (float alpha) 메서드가 있다는 것을 기억하는 것이 좋습니다. 또는 view.getBackground (). setAlpha ()를 시도 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.