LibGDX RTL字体渲染?

时间:2016-05-21 14:05:21

标签: java android libgdx

我正在创建一个应该支持两种语言的应用程序,英语和希伯来语。

问题是希伯来语是从右到左的西方语言,英语是从左到右的语言,而LibGDX不支持RTL字体。

我已经为字体创建了位图,一切正常

img

但是当我用希伯来语写作时,它会写出反转的字样。当我单独用希伯来语写作时,我有一个解决方案,只需用StringBuilder反转单词,但这是一个便宜的修复。但是,如果我想实现聊天或角色名称呢?

3 个答案:

答案 0 :(得分:5)

从我能看到的最简单的解决方案是使用Heiro。如果你看一下这个线程Hiero Rendering Arabic fonts Right to Left哪里有最近的条款来容纳RTL

enter image description here

从那里变得越来越困难。关于这个问题有很多问题(一个例子Showing non-western language from right to left in libgdx (Android))和更少的解决方案。

您可以选择为常用的单词或表达式创建字符串的字形库,尽管这是一个艰苦的设置过程,并且在使用聊天时会产生开销,就像您的字符串一样逆转。

libgdx github Support for complex font rendering (Chinese, Arabic, ...)中的讨论。进入这些以及更多选项,包括支持Windows sridharsundaram/complexscriptlayout所做的工作,虽然这不是Android,但可能值得研究进一步的开发思路。

从积极的方面来看,这方面的近期发展越来越多,因此对于使用libgdx的开发人员来说,RTL和bidi格式会变得越来越容易。

感兴趣的是这个支持问题Right-To-Left Text Rendering Support #787,因为存在开发资源相同问题的人的痕迹痕迹。

答案 1 :(得分:1)

到目前为止,还没有一种方法可以呈现从右到左的文本,如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格式)添加到方法中以获得更多功能。希望它有所帮助!

答案 2 :(得分:0)

我正在努力...您可以使用它:

https://github.com/scorpion16/libgdx-rtl-support

libgdx - RTL support - Arabic and Persian