【发布时间】:2015-12-23 03:26:24
【问题描述】:
如何在Libgdx中使用subscript和superscript文字和数字。
【问题讨论】:
标签: android libgdx label subscript superscript
如何在Libgdx中使用subscript和superscript文字和数字。
【问题讨论】:
标签: android libgdx label subscript superscript
恐怕没有默认机制来制作下标或上标,但使用 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
【讨论】:
【讨论】:
获取 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;
}
【讨论】: