Thao tác các byte alpha của Java / Android màu int


81

Nếu tôi có một int trong Java mà tôi đang sử dụng làm màu Android (để vẽ trên Canvas), làm cách nào để chỉ thao tác với thành phần alpha của int đó? Ví dụ, tôi có thể sử dụng một phép toán để thực hiện việc này như thế nào:

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

Lý tưởng nhất là nhân các byte đầu tiên đó với bất kỳ giá trị nào factorthay vì chỉ đặt các byte thành giá trị tĩnh.

Câu trả lời:


175

Kiểm tra lớp Màu .

Mã của bạn sẽ trông giống như thế này.

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

Vì vậy, gói nó trong một phương thức có thể giống như sau:

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

Và sau đó gọi nó để đặt độ trong suốt, giả sử 50%:

int halfTransparentColor = adjustAlpha(0xFFFFFFFF, 0.5f);

Tôi nghĩ rằng việc sử dụng lớp Màu được cung cấp sẽ tự ghi lại nhiều hơn một chút mà chỉ cần tự thực hiện thao tác một chút, cộng với việc nó đã được thực hiện cho bạn.


46
ColorUtils.setAlphaComponent()thực hiện chính xác điều này
Patrick Favre

11
Bạn đúng, đó ColorUtilslà cách đúng bây giờ, nhưng lớp đó đã không tồn tại khi tôi viết câu trả lời này.
majormajors



39

Một thay thế là:

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

Hoặc sử dụng float:

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

Bạn có thể thay đổi bất kỳ kênh nào bằng cách thay đổi giá trị bitwise 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

Đây không phải là câu trả lời trực tiếp cho câu hỏi nhưng bạn nên nhớ rằng View và Drawable có phương thức setAlpha (float alpha) có thể làm những gì bạn muốn. Hoặc bạn có thể muốn thử view.getBackground (). SetAlpha ().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.