我正在創建一個應該支持兩種語言,英語和希伯來語的應用程序。LibGDX RTL字體渲染?
問題是希伯來語是從右到左的西方語言,英文是從左到右的語言,LibGDX不支持RTL字體。
我已經創建了字體的位圖和一切正常
但是,當我在寫的希伯來語,它會寫顛倒了的話。當我只用希伯來語寫作時,我有一個解決方案,只需使用StringBuilder
來反轉這些字詞,但這是一個便宜的解決方案。但是如果我想實現聊天或角色名稱呢?
我正在創建一個應該支持兩種語言,英語和希伯來語的應用程序。LibGDX RTL字體渲染?
問題是希伯來語是從右到左的西方語言,英文是從左到右的語言,LibGDX不支持RTL字體。
我已經創建了字體的位圖和一切正常
但是,當我在寫的希伯來語,它會寫顛倒了的話。當我只用希伯來語寫作時,我有一個解決方案,只需使用StringBuilder
來反轉這些字詞,但這是一個便宜的解決方案。但是如果我想實現聊天或角色名稱呢?
從我所能看到的最簡單的解決方案是使用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,但對於進一步的開發想法可能值得研究。
從積極的方面來看,這一方面最近有很多發展,所以對於使用libgdx的開發人員來說,RTL和雙向格式應該變得越來越容易。
感興趣的是這個支持問題Right-To-Left Text Rendering Support #787因爲有同樣的問題開發資源的人的麪包屑痕跡。
從現在開始,真的沒有辦法呈現從右到左的文本,如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
['FreeTypeFontGenerator'](https://github.com/libgdx/libgdx/wiki/Gdx-freetype)中有一個免責聲明,它在讀取RTL時不適用於RTL?那是主要的,抱歉,我指責你抄襲,這對我來說很粗魯,我錯了。 –
它看起來像[LibGDX不支持RTL語言](https://github.com/libgdx/libgdx/issues/787),無論如何不是開箱即用。 – asherbar
你如何使用「位圖」顯示爲字體?或者你已經有了一個.ttf或.otf文件的字體? – AkashBhave
但你爲什麼認爲你的代碼是「廉價版」?它出什麼問題了?只是因爲你構建它,並且api沒有支持它,所以它不會錯誤,你能提供這個「廉價構建」的代碼嗎? –