带有 9patch 的 LibGdx 标签背景

Posted

技术标签:

【中文标题】带有 9patch 的 LibGdx 标签背景【英文标题】:LibGdx label background with 9patch 【发布时间】:2016-04-08 15:19:21 【问题描述】:

所以我遇到了这个我根本无法解决的问题。 我正在 LibGdx 的帮助下制作游戏,并尝试创建聊天气泡功能。问题是,当我尝试将标签样式的背景更改为 9patch 可绘制对象时,它无法很好地缩放,或者根本无法缩放?

public class ChatBubble

    private Label textLabel;
    private BitmapFont font;
    private Label.LabelStyle lStyle;
    private int scaledWidth = 0;
    private int scaledHeight = 0;
    private Timer.Task currentTask;
    private Texture bkg;

    public ChatBubble()
    
        font = new BitmapFont();
        font.setColor(Color.BLACK);
        bkg = new Texture("data/ui/chatb.9.png");

        NinePatch np = new NinePatch(bkg,11,11,9,10);
        NinePatchDrawable npd = new NinePatchDrawable(np);
        lStyle = new Label.LabelStyle(font,font.getColor());
        lStyle.background = npd;

        textLabel = new Label("",lStyle);
        textLabel.setVisible(false);
        textLabel.setAlignment(Align.center);
        currentTask = new Timer.Task() 
            @Override
            public void run() 
                textLabel.setVisible(false);
            ;
    

    public void show(String text, float duration)
    
        if(currentTask.isScheduled())currentTask.cancel();
        textLabel.setText(text);
        textLabel.setVisible(true);
        scaledHeight = (int)textLabel.getPrefHeight();
        scaledWidth = (int)textLabel.getWidth()/2;
        Timer.schedule(currentTask,duration);
    

    public void show(String text)
    
        if(currentTask.isScheduled())currentTask.cancel();
        textLabel.setText(text);
        textLabel.setVisible(true);
        scaledHeight = (int)textLabel.getPrefHeight();
        scaledWidth = (int)textLabel.getWidth()/2;
        Timer.schedule(currentTask,(float)(text.length()*0.1));
    

    public void draw(SpriteBatch batch, float x, float y)
    
        if(!textLabel.isVisible())return;
        textLabel.setPosition(x - scaledWidth, y + scaledHeight);
        batch.begin();
        textLabel.draw(batch, 1);
        batch.end();
    

游戏中的外观:

9batch 的外观:

任何帮助将不胜感激!

更新: 我发现我的 9patch 可以缩放,问题在于标签在调用 setText() 时没有更新它的大小,因此它的宽度和高度为 0,因为构造函数是 "".. 在标签上调用 layout() 不会解决这个问题。

【问题讨论】:

【参考方案1】:

.setText() 之后的标签上调用.pack(),告诉它根据文本调整自身大小(加上背景可绘制对象中的任何填充)。您无需致电layout(),因为这是自动处理的。

我不确定您必须手动调用 pack() 的确切原因,但对于您不是 WidgetGroup 子类(即 Table、VerticalGroup 等)的子类的 Widget,通常是这种情况。

【讨论】:

我之前尝试过,不幸的是并没有改变任何东西。我现在解决这个问题的方法是 label = new label("",stylewithbkg);每次我显示一个新的聊天气泡时......这不是很聪明的记忆方式:(

以上是关于带有 9patch 的 LibGdx 标签背景的主要内容,如果未能解决你的问题,请参考以下文章

9patch 导致奇怪的 layout_height 问题

js点击ul中某个li标签,改变这个li标签的背景图,当点击其它li标签时前一个被点击的标签背景

怎么可以改变Li标签的背景颜色

带有链接的 li 内的 span 标签在悬停时移动

将 libgdx 部署到 html

UI界面——9patch图片理解与运用