【问题标题】:LibGDX RTL font rendering?LibGDX RTL 字体渲染?
【发布时间】:2016-05-21 14:05:20
【问题描述】:

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

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

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

但是当我用希伯来语写的时候,它会把单词写反了。当我只用希伯来语写作时,我有一个解决方案,只需使用StringBuilder 反转单词,但这是一个便宜的解决方案。但是,如果我想实现聊天或角色名称怎么办?

【问题讨论】:

  • 看起来像LibGDX does not support RTL languages,反正不是开箱即用的。
  • 您如何使用Bitmap 显示为字体?或者您是否已经有字体的 .ttf 或 .otf 文件?
  • 但是为什么你认为你的代码是一个“廉价的构建”?它出什么问题了?仅仅因为你构建它并且api没有对它的支持并不会出错,你能提供这个“廉价构建”的代码吗?
  • @OmarAyala 因为当您将 RTL 和 LTR 语言混合在一起时,此解决方案不起作用,它只会搞砸。如果我用英文写,它将把英文写成 RTL
  • 如果在运行时使用策略模式覆盖你想要的行为会怎样?

标签: java android libgdx


【解决方案1】:

据我所知,最简单的解决方案是使用Heiro。如果您查看此线程 Hiero Rendering Arabic fonts Right to Left,其中最近提供了容纳 RTL 的规定

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

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

这个讨论在libgdx githubSupport for complex font rendering (Chinese, Arabic, ...)。进入这些和更多选项,包括为支持 Windows sridharsundaram/complexscriptlayout 所做的工作,虽然这不是 Android,但可能值得研究进一步的开发想法。

从积极的方面来说,这方面的最新发展越来越多,因此 RTL 和双向格式对于使用 libgdx 的开发人员来说应该会变得越来越容易。

有趣的是这个支持问题Right-To-Left Text Rendering Support #787,因为有相同问题的人开发资源的面包屑痕迹。

【讨论】:

    【解决方案2】:

    截至目前,确实没有办法呈现从右到左的文本,如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 而言),我所做的只是建议创建一个方法,这样他就不必重复代码。
    【解决方案3】:

    在 github 上使用这个解决方案:

    https://github.com/ultra-deep/libgdx-rtl-support

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2015-07-04
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多