libgdx中如何使用下标和上标文字?

How to use subscript and superscript text in libgdx?

如何在Libgdx中使用下标上标文本和数字.

恐怕没有制作下标或上标的默认机制,但使用 Scene2d 及其 Label class.

似乎很简单

想法是用您的文本(例如一些数字)渲染普通标签,然后计算并添加到带有下标或上标文本的标签的较小版本。代码如下所示:

    Label label = new Label("2", skin, "default");
    Label subscript = new Label("n", skin, "smaller");

    subscript.setPosition(label.getX() + label.getWidth() + xLittleOffset, label.getY() + yOffset);

如果您不想保留两种样式的标签,您可以将下标创建为它的 默认 版本并应用一些比例。

    Label subscript = new Label("n", skin, "default");
    subscript.setFontScale(0.5f);

    ...

当然不使用Scene2d也可以实现,但是简单的批量渲染,在正常之后渲染较小的文本,使用一些y轴偏移使用

draw(Batch batch, java.lang.CharSequence str, float x, float y, float targetWidth, int halign, boolean wrap)

绘制函数的版本。代码如下:

    BitmapFont font = createTheFont(); // here you are creating the font

    //...

    //in your render function:
    batch.begin();

    font.draw(batch, "2", x, y, width, halign, false);

    font.setScale(.2f);
    font.draw(batch, "n", x + width, y + someOffset, n_width, halign, false);

    batch.end();

如果你需要渲染 subscript/superscript inside 标签或文本,这会有点困难但并非不可能 - 你需要做的就是计算位置你的字形以某种方式留下一点 space 为它添加一些 spaces 在原来的。

计算字形位置相当困难,但您可以迭代 Label GlyphRuns 及其 xAdvances 值(这是某种左偏移量)。根据以下内容尝试自己弄清楚:

    float x, y; //positions of glyph after which you want to add subscipt/superscript

    for(GlyphRun run : label.getGlyphLayout().runs)
    {
        for(int i = 0; i < run.xAdvances.size - 1; i++)
        {
            x += run.xAdvances.get(i));
        }

        //now you are after run so you can modify y position
        y += rowHeight; //I'm not sure but it probably should be that rowHeight = label.getStyle().font.getLineHeight();
    }

查看 this article 了解更多关于新 Libgdx 版本中的字形、字体等的信息

不幸的是,我不知道如何在使用批处理时实现它

您可以在此处阅读有关 Scene2d 的更多信息:https://github.com/libgdx/libgdx/wiki/Scene2d

获取libgdx中的下标和上标。

private Group createSubScript(String str1, String str2, LabelStyle labelStyle) {
    Group grp = new Group();
    Label label1 = new Label(str1, labelStyle);
    // label1.setPosition(20, 80);
    grp.addActor(label1);
    Label subscript = new Label(str2, labelStyle);
    subscript.setFontScale(0.7f);
    subscript.setPosition(label1.getX() + label1.getWidth(), label1.getY() - 4);
    grp.addActor(subscript);
    return grp;
}

private Group createSuperScript(String str1, String str2, LabelStyle labelStyle) {
    Group grp = new Group();
    Label label1 = new Label(str1, labelStyle);
    // label1.setPosition(20, 80);
    grp.addActor(label1);
    Label subscript = new Label(str2, labelStyle);
    subscript.setFontScale(0.7f);
    subscript.setPosition(label1.getX() + label1.getWidth(), label1.getY() + 4);
    grp.addActor(subscript);
    return grp;
}

我扩展了已接受的答案,使其更加稳健和通用,现在它可以与科学计数法中的 pre 和 post 文本一起用于表格中。

还增加了解析计算机科学记数法解析器的功能

code is in this gist