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 文本一起用于表格中。
还增加了解析计算机科学记数法解析器的功能
如何在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 文本一起用于表格中。
还增加了解析计算机科学记数法解析器的功能