ARGB六角颜色到LibGdx颜色

时间:2018-04-01 16:43:38

标签: android libgdx

我正在将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中使用?

由于

3 个答案:

答案 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;
}