2016-05-21 165 views
5

我正在創建一個應該支持兩種語言,英語和希伯來語的應用程序。LibGDX RTL字體渲染?

問題是希伯來語是從右到左的西方語言,英文是從左到右的語言,LibGDX不支持RTL字體。

我已經創建了字體的位圖和一切正常

img

但是,當我在寫的希伯來語,它會寫顛倒了的話。當我只用希伯來語寫作時,我有一個解決方案,只需使用StringBuilder來反轉這些字詞,但這是一個便宜的解決方案。但是如果我想實現聊天或角色名稱呢?

+0

它看起來像[LibGDX不支持RTL語言](https://github.com/libgdx/libgdx/issues/787),無論如何不是開箱即用。 – asherbar

+0

你如何使用「位圖」顯示爲字體?或者你已經有了一個.ttf或.otf文件的字體? – AkashBhave

+0

但你爲什麼認爲你的代碼是「廉價版」?它出什麼問題了?只是因爲你構建它,並且api沒有支持它,所以它不會錯誤,你能提供這個「廉價構建」的代碼嗎? –

回答

4

從我所能看到的最簡單的解決方案是使用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 githubSupport for complex font rendering (Chinese, Arabic, ...)。進入這些和更多的選項,包括爲支持Windows sridharsundaram/complexscriptlayout所做的工作,儘管這不是Android,但對於進一步的開發想法可能值得研究。

從積極的方面來看,這一方面最近有很多發展,所以對於使用libgdx的開發人員來說,RTL和雙向格式應該變得越來越容易。

感興趣的是這個支持問題Right-To-Left Text Rendering Support #787因爲有同樣的問題開發資源的人的麪包屑痕跡。

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格式)添加到您的方法以獲得更多功能。希望能幫助到你!

+0

錯誤信息?對不起,如果它看起來像複製,但我沒有看到你的答案,直到我張貼我的和刷新頁面。另外,如果他的方法正在工作(就顯示RTL而言),我所做的只是提出一種方法,所以他不必重複代碼。 – AkashBhave

+1

['FreeTypeFontGenerator'](https://github.com/libgdx/libgdx/wiki/Gdx-freetype)中有一個免責聲明,它在讀取RTL時不適用於RTL?那是主要的,抱歉,我指責你抄襲,這對我來說很粗魯,我錯了。 –