ARGB 十六进制颜色到 LibGdx 颜色
ARGB Hex Colour To LibGdx Colour
我正在制作一个 LibGdx 应用程序作为 Android 片段嵌入。
我在传递要在 LibGdx
中使用的 Android 颜色资源时遇到问题
这是我的颜色
<resources>
<color name="red">#FF0000</color>
</resources>
我传这个颜色如下
ContextCompat.getColor(getContext(),R.color.red)
这个 returns 一个 int
我将其转换为 float
我有一个纹理,它是一个白色圆圈,我这样着色
spriteCircle.setColor(myColor)
这需要 Sprite
class public void setColor (float color)
输出不是红色而是不同的颜色
使用 LibGdx com.badlogic.gdx.graphics.Color
中的颜色常量之一会产生正确的结果,因此我的纹理可以正确着色,因此我可以排除这种情况。
我的理论是 Android 颜色与 LibGdx
的格式不同
我写了这个方法来帮助转换那个
private com.badlogic.gdx.graphics.Color convertColorToLibGdxColor(int color) {
float alpha = Color.alpha(color);
float red = Color.red(color);
float green = Color.green(color);
float blue = Color.blue(color);
return new com.badlogic.gdx.graphics.Color(red, green, blue, alpha);
}
注意 Color.red
方法来自 android.graphics.Color
class
/**
* Return the red component of a color int. This is the same as saying
* (color >> 16) & 0xFF
*/
public static int red(int color) {
return (color >> 16) & 0xFF;
}
有一种方法可以用于蓝色、绿色和 alpha。
然后我从 Sprite
class
调用 public void setColor (Color tint)
有趣的是,如果我使用 Android android.graphics.Color
中的颜色常量,例如
@ColorInt public static final int RED = 0xFFFF0000;
它工作正常但不是我在上面发布的颜色资源
当我比较两者时,我可以看到我的颜色资源省略了 alpha 通道,所以我决定填充那部分,所以现在它是
<resources>
<color name="red">#FFFF0000</color>
</resources>
但是,我仍然遇到同样的问题
调试 ContextCompat.getColor(getContext(),R.color.red)
产生一个值 0xFFD4172A
。我想问题出在这里
tl;dr 是否可以翻译 Android 颜色资源以用于 LibGdx?
谢谢
我在这里找到了一个真正解决我问题的要点
https://gist.github.com/steen919/8a079f4dadf88d4197bb/d732449eb74321207b4b189a3bcbf47a83c5db65
public final class ArgbHexToLibGdxColor {
private ArgbHexToLibGdxColor() {
}
/**
* Taken from https://gist.github.com/steen919/8a079f4dadf88d4197bb/d732449eb74321207b4b189a3bcbf47a83c5db65
* Converts the given hex color in 0xAARRGGBB format to a {@link Color} that can be used in a LibGdx application
*/
public static Color convert(long hex) {
float a = (hex & 0xFF000000L) >> 24;
float r = (hex & 0xFF0000L) >> 16;
float g = (hex & 0xFF00L) >> 8;
float b = (hex & 0xFFL);
return new Color(r / 255f, g / 255f, b / 255f, a / 255f);
}
/**
* Converts a Android color resource into a {@link Color} that can be used in a LibGdx application
*
* @see #convert(long)
*/
public static Color convert(@NonNull Context context, @ColorRes int colorRes) {
return convert(ContextCompat.getColor(context, colorRes));
}
}
这似乎适用于从 colors.xml 文件中获得的颜色和来自 Android 颜色 class
的常量
在libgdx颜色class中实际上有一个方法可以做到这一点。
https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Color.html#argb8888ToColor-com.badlogic.gdx.graphics.Color-int-
它也是静态方法,但不是返回新颜色,而是更改现有颜色。
感谢@deniz-yılmaz
LibGdx已经有解析ARGB颜色的方法
private com.badlogic.gdx.graphics.Color convertArgbToLibGdxColor(@ColorInt int argbColor) {
com.badlogic.gdx.graphics.Color color = new com.badlogic.gdx.graphics.Color();
com.badlogic.gdx.graphics.Color.argb8888ToColor(color, argbColor);
return color;
}
我正在制作一个 LibGdx 应用程序作为 Android 片段嵌入。
我在传递要在 LibGdx
中使用的 Android 颜色资源时遇到问题这是我的颜色
<resources>
<color name="red">#FF0000</color>
</resources>
我传这个颜色如下
ContextCompat.getColor(getContext(),R.color.red)
这个 returns 一个 int
我将其转换为 float
我有一个纹理,它是一个白色圆圈,我这样着色
spriteCircle.setColor(myColor)
这需要 Sprite
class public void setColor (float color)
输出不是红色而是不同的颜色
使用 LibGdx com.badlogic.gdx.graphics.Color
中的颜色常量之一会产生正确的结果,因此我的纹理可以正确着色,因此我可以排除这种情况。
我的理论是 Android 颜色与 LibGdx
的格式不同我写了这个方法来帮助转换那个
private com.badlogic.gdx.graphics.Color convertColorToLibGdxColor(int color) {
float alpha = Color.alpha(color);
float red = Color.red(color);
float green = Color.green(color);
float blue = Color.blue(color);
return new com.badlogic.gdx.graphics.Color(red, green, blue, alpha);
}
注意 Color.red
方法来自 android.graphics.Color
class
/**
* Return the red component of a color int. This is the same as saying
* (color >> 16) & 0xFF
*/
public static int red(int color) {
return (color >> 16) & 0xFF;
}
有一种方法可以用于蓝色、绿色和 alpha。
然后我从 Sprite
class
public void setColor (Color tint)
有趣的是,如果我使用 Android android.graphics.Color
中的颜色常量,例如
@ColorInt public static final int RED = 0xFFFF0000;
它工作正常但不是我在上面发布的颜色资源
当我比较两者时,我可以看到我的颜色资源省略了 alpha 通道,所以我决定填充那部分,所以现在它是
<resources>
<color name="red">#FFFF0000</color>
</resources>
但是,我仍然遇到同样的问题
调试 ContextCompat.getColor(getContext(),R.color.red)
产生一个值 0xFFD4172A
。我想问题出在这里
tl;dr 是否可以翻译 Android 颜色资源以用于 LibGdx?
谢谢
我在这里找到了一个真正解决我问题的要点 https://gist.github.com/steen919/8a079f4dadf88d4197bb/d732449eb74321207b4b189a3bcbf47a83c5db65
public final class ArgbHexToLibGdxColor {
private ArgbHexToLibGdxColor() {
}
/**
* Taken from https://gist.github.com/steen919/8a079f4dadf88d4197bb/d732449eb74321207b4b189a3bcbf47a83c5db65
* Converts the given hex color in 0xAARRGGBB format to a {@link Color} that can be used in a LibGdx application
*/
public static Color convert(long hex) {
float a = (hex & 0xFF000000L) >> 24;
float r = (hex & 0xFF0000L) >> 16;
float g = (hex & 0xFF00L) >> 8;
float b = (hex & 0xFFL);
return new Color(r / 255f, g / 255f, b / 255f, a / 255f);
}
/**
* Converts a Android color resource into a {@link Color} that can be used in a LibGdx application
*
* @see #convert(long)
*/
public static Color convert(@NonNull Context context, @ColorRes int colorRes) {
return convert(ContextCompat.getColor(context, colorRes));
}
}
这似乎适用于从 colors.xml 文件中获得的颜色和来自 Android 颜色 class
的常量在libgdx颜色class中实际上有一个方法可以做到这一点。 https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Color.html#argb8888ToColor-com.badlogic.gdx.graphics.Color-int-
它也是静态方法,但不是返回新颜色,而是更改现有颜色。
感谢@deniz-yılmaz
LibGdx已经有解析ARGB颜色的方法
private com.badlogic.gdx.graphics.Color convertArgbToLibGdxColor(@ColorInt int argbColor) {
com.badlogic.gdx.graphics.Color color = new com.badlogic.gdx.graphics.Color();
com.badlogic.gdx.graphics.Color.argb8888ToColor(color, argbColor);
return color;
}