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

时间:2015-09-25 10:04:28

标签: android libgdx label subscript superscript

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

3 个答案:

答案 0 :(得分:5)

我担心没有默认机制来制作下标或上标,但在使用Scene2d及其Label类时似乎很简单。

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

    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();

如果你需要在标签或文本中使用下标<上标 ,那将会有点困难但并非不可能 - 你需要做的就是以某种方式计算你的字形的位置并留下一个在原版中添加一些空格的小空间。

计算字形位置相当困难,但你可以迭代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();
    }

在新的Libgdx版本中查看this article以了解有关字形,字体等的更多信息

不幸的是,在使用批处理

时,我不知道如何实现它

您可以在此处详细了解Scene2d:https://github.com/libgdx/libgdx/wiki/Scene2d

答案 1 :(得分:0)

我扩展了已接受的答案,使其更加健壮和通用。现在,它可以在表中与科学记数法中的前后文本一起使用。

它还添加了一个解析计算机科学记数法解析器的函数

code is in this gist

答案 2 :(得分:-3)

在libgdx中获取subScript和superScript。

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