【问题标题】:How to use subscript and superscript text in libgdx?如何在 libgdx 中使用下标和上标文本?
【发布时间】:2015-12-23 03:26:24
【问题描述】:

如何在Libgdx中使用subscriptsuperscript文字和数字。

【问题讨论】:

    标签: android libgdx label subscript superscript


    【解决方案1】:

    恐怕没有默认机制来制作下标或上标,但使用 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();
        }
    

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      code is in this gist

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 嘿,伙计 - 不理解我的意思,但您是否只是将我的答案复制为您的,未接受我的并接受了“您的”? :D:D:D
        • 我没有复制粘贴你的答案。虽然在我问这个问题的时候,你的回答对我有帮助。我接受了你的回答,现在很高兴。 :)
        猜你喜欢
        • 2019-06-12
        • 2013-05-09
        • 2015-05-27
        • 1970-01-01
        • 2017-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多