LibGDX RTL字体渲染?

5
我正在创建一款应用程序,应该支持两种语言,英语和希伯来语。
问题在于,希伯来语是从右到左的西方语言,而英语是从左到右的语言,而LibGDX不支持RTL字体。
我已经为字体创建了位图,一切都正常。
但是当我使用希伯来语写作时,单词会倒过来。如果我只写希伯来语,我有一个解决方法,就是使用StringBuilder反转单词,但这是一个廉价的解决方法。但是如果我想实现聊天或角色名称呢?

看起来LibGDX不支持RTL语言,至少没有开箱即用的支持。 - asherbret
你是如何使用 Bitmap 作为字体显示的?或者你已经有了一个 .ttf 或 .otf 字体文件吗? - AkashBhave
但是你为什么认为你的代码是“廉价构建”?它有什么问题吗?仅仅因为你构建了它,并且API不支持它,并不意味着它是错误的,你可以提供这个“廉价构建”的代码吗? - Omar Ayala
@OmarAyala 因为这个解决方案在混合使用RTL和LTR语言时无法正常工作,它只会搞乱一切。如果我用英语写,它会将英语写成RTL。 - Artemkller545
如果您使用策略模式在运行时覆盖所需的行为,会怎样呢? - Omar Ayala
3个回答

6
从我所看到的,最简单的解决方案是使用Heiro。如果您查看这个线程Hiero Rendering Arabic fonts Right to Left,最近提供了适应RTL的功能。

enter image description here

从那里开始就变得越来越困难了。关于这个问题有很多问题(例如在libgdx中显示非西方语言的从右到左),但解决方案较少。

你可以选择创建常用词或表达式的字符串字形库,尽管这是一个费时的过程,而且在使用聊天时会有时间开销,就像字符串反转一样。

这个讨论libgdx github支持复杂字体渲染(中文、阿拉伯文等)。涉及到这些以及更多选项,包括支持Windows sridharsundaram/complexscriptlayout,虽然那不是Android,但可能值得进一步探索开发思路。

在积极的一面,这方面有越来越多的最新发展,因此对于使用libgdx的开发人员来说,RTL和bidi格式应该变得越来越容易。
有趣的是这个支持问题Right-To-Left Text Rendering Support #787,因为有许多人都遇到了相同的问题正在开发资源。

0

0

目前,还没有一种方法可以呈现从右到左的文本,正如this中所示。因此,唯一的方法是使用StringBuilder反转文本,然后显示它。更有效的呈现反转文本的方法是创建一个方法,根据需要显示文本,这样每次尝试写从右到左的文本时就不必反转它了。如果您创建了一个方法,就可以将RTL文本实现到聊天、名称或其他需要RTL字体的图形中。

我还建议将位图转换为.ttf文件,以便在保持良好质量的同时轻松使用自定义字体。然后,您可以使用FreeTypeFontGenerator来很好地呈现您的字体。如果无法将Bitmap转换为字体,则可以使用下面的方法显示文本。一个非常好的替代方案是Hiero库。您可以选择RTL文本复选框。

这里是一个你可以创建的方法示例,用于渲染文本(使用FreeTypeFontGenerator):

// Keep the generator here so that it is not created each time
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fontFile.ttf"));
public void renderRTL(float x, float y, int fontSize, String text) {
    batch.begin(); // Lets you draw on the screen

    // Reverses the text given
    StringBuilder builder = new StringBuilder();
    builder.append(text);
    builder.reverse();
    String outputText = builder.toString();

    // Creates the font
    FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
    parameter.size = fontSize;
    parameter.characters = "ALL HEBREW CHARACTERS"; // Put all your Hebrew characters in this String
    scoreFont = generator.generateFont(parameter);
    scoreFont.setColor(Color.BLACK);
    scoreFont.draw(batch, outputText, x, y); // Actually draws the text
    generator.dispose(); // Clears memory

    batch.end();
}

请确保将所有这些依赖项添加到您的build.gradle文件中(在依赖项部分)。
compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"

你可以选择在你的方法中添加一个颜色参数(以RGBA格式),以获得更多的功能。希望能帮到你!

误解?如果看起来像是抄袭,对不起,但在我发布我的答案并刷新页面之前,我没有看到你的答案。此外,如果他的方法有效(显示RTL),那么我所做的只是建议他制作一个方法,这样他就不必重复代码。 - AkashBhave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接