我正在将LibGdx应用程序嵌入为Android片段。
我在传递要在LibGdx中使用的Android颜色资源时遇到问题
这是我的颜色
<resources>
<color name="red">#FF0000</color>
</resources>
我将此颜色传递如下
ContextCompat.getColor(getContext(),R.color.red)
这会返回int
,我将其转换为float
我有一个纹理,这是一个白色圆圈,我这样着色
spriteCircle.setColor(myColor)
这会调用Sprite
班级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
类
/**
* 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的方法很好。
然后我从public void setColor (Color tint)
类
Sprite
有趣的是,如果我使用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中使用?
由于
答案 0 :(得分:3)
在libgdx颜色类中实际上有一种方法。 https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Color.html#argb8888ToColor-com.badlogic.gdx.graphics.Color-int-
它也是静态方法,但不是返回新颜色,而是改变现有颜色。
答案 1 :(得分:0)
我发现了一个Gist,它实际上解决了我的问题 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 Color类的常量
答案 2 :(得分:0)
感谢@ 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;
}