如何更改libgdx标签中背景的颜色?

时间:2013-08-10 21:32:31

标签: java android libgdx

我可以像这样更改字体的颜色

LabelStyle style1 = new LabelStyle(..some font..., 
                Color.valueOf("FF4500")
                );
label.setStyle(style1);

但如何更改背景? 现在,背景与在

中设置的整个屏幕的背景相同

渲染方法lke this

Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    Gdx.gl.glClearColor(
            1.000f, 0.980f, 0.941f

            ,1);

3 个答案:

答案 0 :(得分:8)

Label label = new Label(labelText, skin);
Pixmap labelColor = new Pixmap(labelWidth, labelHeight, Pixmap.Format.RGB888);
labelColor.setColor(<your-color-goes-here>);
labelColor.fill();
label.getStyle().background = new Image(new Texture(labelColor)).getDrawable();

基本上,使用Image类的getDrawable()函数来指定Label的LabelStyles&#39;背景Drawable。

这是我能够提出的最简单的解决方法,坦率地说,Label类中没有setBackground()是愚蠢的。

实际上,最简单的修复方法可能是破解Label类并为其添加setBackground()方法。

[编辑]完成后,请务必处理Pixmaps;即labelColor.dispose();

[更新] @Mitrakov Artem提出了一个很好的观点:上述解决方案将影响此LabelStyle的所有实例。如果这不是您想要的,您可以创建一个新的LabelStyle,在其上使用上面的方法,然后将其保存到Label。引用Artem:&#34;所以我建议创建一个新样式(LabelStyle style = new LabelStyle(label.getStyle());),更改其背景然后将其应用于标签(label.setStyle(style); )&#34;

答案 1 :(得分:3)

实际上你不会像那样改变Lable的背景。你刚刚改变了clearcolour。猜猜你知道。

要更改背景,您需要更改标签样式的背景。为此,我建议使用简单的NinePatch作为背景,(可以是正方形!如果它的白色,你可以改变九个色块的颜色和背景颜色的变化!)

NinePatch temp = new NinePatch(new Texture(....), 10, 10, 10, 10); //edges

有关ninepatch的更多信息,请查看here libgdx wiki ninepatch

需要将该九个补丁添加到Skin objekt。例如像这样

Skin skin = new Skin();
skin.add("background",temp)

之后,您可以从皮肤中获取可以设置为LabelStyle背景的绘图。

style1.background = skin.getDrawable("background");

请参阅libgdx API LabelStyle

您也可以使用简单的位图,但这会缩放到标签大小,这会导致大多数情况下变形。 Ninepatch可以缩放而不会变形。

答案 2 :(得分:1)

如果您需要快速简便的解决方案,可以使用下面的代码段。它不适用于多行文本,因为它没有考虑每行的文本宽度。 无论如何,背景会自动调整为标签小部件的宽度和高度(即,如果您的文本更改)。

private Label label = new Label("text", createLabelStyleWithBackground());

private LabelStyle createLabelStyleWithBackground() {
    LabelStyle labelStyle = new LabelStyle();
    labelStyle.font = new BitmapFont();
    labelStyle.fontColor = Color.WHITE;
    labelStyle.background = createBackground();
    return labelStyle;
}

private Drawable createBackground() {
    Pixmap labelColor = new Pixmap(1, 1, Pixmap.Format.RGBA8888);
    Color color = new Color(Color.GRAY);
    color.a = 0.75f;
    labelColor.setColor(color);
    labelColor.fill();

    Texture texture = new Texture(labelColor);

    return new BaseDrawable() {

        @Override
        public void draw(Batch batch, float x, float y, float width, float height) {
            GlyphLayout layout = label.getGlyphLayout();
            x = label.getX();
            y = label.getY() - (layout.height + 15) / 2; // +15 is some space 
            batch.draw(texture, x, y, layout.width, layout.height + 15);
        }
    };
}

here is an example with a multiline label