ARGB十六进制颜色转LibGdx Colour:Android Fragment嵌入LibGdx颜色传递问题
Hey, I've run into this exact issue before when embedding LibGDX as an Android Fragment—those color format differences can be tricky! Let me break down what's going wrong and how to fix it.
The Core Mismatch Between Android and LibGDX Colors
First, let's clarify why your current approach isn't working:
- Android's
ContextCompat.getColor()returns a 32-bit integer in ARGB format. For your#FF0000red color, this actually resolves to0xFFFF0000(alpha=255, red=255, green=0, blue=0) since Android assumes full opacity if you don't specify an alpha channel. - LibGDX's
Sprite.setColor()expects color values in RGBA format, with each channel (red, green, blue, alpha) represented as a float between0.0fand1.0f. Worse, if you pass a single float (like converting the Android int directly), you're using the overload that sets a grayscale value—not a full color.
Quick Fix: Manual Channel Extraction
You can directly pull each color channel from the Android int, convert it to a 0-1 float, and pass them to the correct setColor() overload:
// Get the Android ARGB color int int androidColor = ContextCompat.getColor(getContext(), R.color.red); // Extract each channel (shift and mask to isolate 8 bits per channel) float alpha = ((androidColor >> 24) & 0xFF) / 255.0f; float red = ((androidColor >> 16) & 0xFF) / 255.0f; float green = ((androidColor >> 8) & 0xFF) / 255.0f; float blue = (androidColor & 0xFF) / 255.0f; // Apply the color to your sprite (using the 4-parameter overload) spriteCircle.setColor(red, green, blue, alpha);
Cleaner Reusable Solution: Utility Method
If you need to convert Android colors to LibGDX format multiple times, wrap the logic in a utility method for easy reuse:
import com.badlogic.gdx.graphics.Color; public class ColorConverter { public static Color androidToLibgdx(int androidArgbColor) { float alpha = ((androidArgbColor >> 24) & 0xFF) / 255.0f; float red = ((androidArgbColor >> 16) & 0xFF) / 255.0f; float green = ((androidArgbColor >> 8) & 0xFF) / 255.0f; float blue = (androidArgbColor & 0xFF) / 255.0f; return new Color(red, green, blue, alpha); } }
Then use it like this:
int androidColor = ContextCompat.getColor(getContext(), R.color.red); spriteCircle.setColor(ColorConverter.androidToLibgdx(androidColor));
Why Your Original Approach Failed
When you converted the Android color int directly to a float and passed it to spriteCircle.setColor(myColor), you were using the setColor(float grayscale) overload. This method takes a single value (0.0 = black, 1.0 = white) and sets the sprite to that grayscale with full opacity. Since your Android color int is a large number (like 16711680 for pure red), converting it to float results in a value way larger than 1.0—LibGDX clamps this to 1.0, leaving your sprite white instead of red.
内容的提问来源于stack exchange,提问作者Ersen Osman

