2016-05-21 50 views
5

Tôi đang tạo một ứng dụng hỗ trợ hai ngôn ngữ, tiếng Anh và tiếng Do Thái.Hiển thị phông chữ LibGDX RTL?

Vấn đề là tiếng Hebrew là Right-To-Left ngôn ngữ phương Tây và tiếng Anh là từ trái sang phải ngôn ngữ, và LibGDX không hỗ trợ phông chữ RTL.

Tôi đã tạo bitmap cho các phông chữ và mọi thứ hoạt động

img

Nhưng khi tôi viết bằng tiếng Hebrew, nó sẽ viết các từ đảo ngược. Tôi có một giải pháp cho điều này khi tôi viết duy nhất trong tiếng do thái, chỉ cần đảo ngược các từ bằng cách sử dụng một StringBuilder, nhưng đó là một sửa chữa giá rẻ. Nhưng nếu tôi muốn thực hiện một cuộc trò chuyện, hoặc tên nhân vật thì sao?

+0

Dường như [LibGDX không hỗ trợ ngôn ngữ RTL] (https://github.com/libgdx/libgdx/issues/787), không phải ra khỏi hộp. – asherbar

+0

Bạn đang sử dụng 'Bitmap' để hiển thị dưới dạng phông chữ như thế nào? Hay bạn đã có tệp .ttf hoặc .otf cho phông chữ? – AkashBhave

+0

nhưng tại sao bạn cho rằng mã của mình là "xây dựng giá rẻ"? có gì sai với nó? chỉ vì bạn xây dựng nó và api không có hỗ trợ cho nó không làm cho nó sai, bạn có thể cung cấp mã của "xây dựng giá rẻ" này? –

Trả lời

4

Từ những gì tôi có thể thấy giải pháp dễ nhất là sử dụng Heiro. Nếu bạn nhìn vào chủ đề này Hiero Rendering Arabic fonts Right to Left nơi có quy định gần đây để chứa RTL

enter image description here

Từ đó nó trở nên ngày càng khó khăn. Có một vài câu hỏi về vấn đề này (một ví dụ Showing non-western language from right to left in libgdx (Android)) và ít giải pháp hơn.

Bạn có tùy chọn tạo thư viện các chuỗi ký tự cho các từ hoặc biểu thức thường được sử dụng, mặc dù đây là một quá trình siêng năng để thiết lập và có chi phí khi sử dụng trò chuyện, chuỗi đảo ngược.

thảo luận trong libgdx githubSupport for complex font rendering (Chinese, Arabic, ...) này. đi vào các tùy chọn này và nhiều hơn nữa bao gồm cả công việc được thực hiện để hỗ trợ Windows sridharsundaram/complexscriptlayout, trong đó, mặc dù đó không phải là Android, có thể đáng để nghiên cứu các ý tưởng phát triển hơn nữa.

Về mặt tích cực, có một số lượng ngày càng cao của sự phát triển gần đây trong lĩnh vực này, vì vậy RTL và các định dạng bidi nên ngày càng trở nên dễ dàng hơn cho các nhà phát triển sử dụng libgdx.

Quan tâm là vấn đề hỗ trợ này Right-To-Left Text Rendering Support #787 như có những con đường mòn mẩu bánh mì của người dân với các nguồn lực phát triển vấn đề tương tự.

1

Tính đến ngay bây giờ, có thực sự không phải là một cách để làm cho quyền văn bản trái, như thể hiện bởi this chủ đề về nó. Vì vậy, cách duy nhất để thực sự làm điều đó là đảo ngược văn bản với StringBuilder và sau đó hiển thị văn bản đó. Cách hiệu quả hơn để hiển thị văn bản được đảo ngược là tạo phương thức hiển thị văn bản cho phù hợp, vì vậy bạn không phải đảo ngược văn bản mỗi khi bạn cố viết văn bản Phải sang trái. Nếu bạn tạo một phương thức, bạn sẽ có thể triển khai văn bản RTL vào cuộc trò chuyện, tên hoặc đồ họa khác yêu cầu phông chữ RTL.

Tôi cũng khuyên bạn nên chuyển đổi bitmap thành tệp .ttf để dễ sử dụng phông chữ tùy chỉnh của bạn trong khi vẫn giữ được chất lượng tốt. Sau đó, bạn có thể sử dụng FreeTypeFontGenerator để hiển thị phông chữ của mình một cách độc đáo. Nếu bạn không thể chuyển đổi Bitmap thành phông chữ, bạn cũng có thể sử dụng phương pháp hiển thị văn bản theo phương thức dưới đây. Một lựa chọn thực sự tốt là thư viện Hiero. Bạn có thể chọn hộp kiểm RTL text.

Dưới đây là một ví dụ về một phương pháp mà bạn có thể tạo ra để làm cho văn bản (bằng cách sử dụng 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(); 
} 

Hãy chắc chắn để thêm tất cả những phụ thuộc vào tập tin build.gradle của bạn (trong phần phụ thuộc) :

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" 

Bạn có thể tùy ý thêm thông số màu (ở định dạng RGBA) vào phương pháp của bạn để có thêm chức năng. Hy vọng nó giúp!

+0

Thông tin sai lệch? Xin lỗi nếu nó giống như sao chép, nhưng tôi không thấy câu trả lời của bạn cho đến khi tôi đăng tải và làm mới trang. Ngoài ra, nếu phương pháp của anh ấy đang hoạt động (về việc hiển thị RTL), tất cả những gì tôi đang làm là gợi ý tạo một phương thức để anh ấy không phải lặp lại mã. – AkashBhave

+1

Có một tuyên bố từ chối trách nhiệm trong ['FreeTypeFontGenerator'] (https://github.com/libgdx/libgdx/wiki/Gdx-freetype) rằng nó không hoạt động cho RTL bạn đã đọc nó chưa? đó là điều chính, và xin lỗi, tôi đã buộc tội bạn sao chép, đó là thô lỗ với tôi, tôi đã sai. –

Các vấn đề liên quan