2013-03-10 2 views
49

Canvas에서 그림을 그리기 위해 Android 색상으로 사용하는 int가 Java에있는 경우 해당 int의 알파 구성 요소를 어떻게 조작합니까? 예를 들어, 내가 작업을 사용할 수있는 방법이 작업을 수행합니다 :Java/Android 색상의 알파 바이트 조작

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

이상적으로는 factor 그냥 정적 값으로 바이트를 설정하기보다는 무엇이든에 의해 그 첫 번째 바이트를 곱하면 좋을 것입니다.

답변

126

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); 

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

그래서처럼 보일 수있는 방법을 포장 제공된 Color 클래스는 비트 조작을 직접하는 것보다 더 많은 자체 문서화입니다. 게다가 이미 완료되었습니다.

+1

'ColorUtils.setAlphaComponent은()'이 정답이 – for3st

34

대안은 다음과 같습니다

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

이 직접 질문에 대답하지 않고는 그보기를 기억하는 좋은 및 그리기 당신이 원하는 것을 할 수있는 setAlpha (플로트 알파) 방법이있다. 또는 view.getBackground(). setAlpha()를 사용해 볼 수도 있습니다.

15

:

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

정확히 않는, 필요는이 논리를 재 작성하지 않으려면 – for3st

관련 문제