2011-10-07 35 views
3

我正在維護一個Android應用程序,人們用它來顯示各種外來語言(如藏語或古希臘語)中的字符串。由於Android設備的字體非常少,用戶可以將字體文件放在SD卡上,應用程序將使用它們。Android:找出哪個字體文件適合我要顯示的字符

問題:給定一個字符串,我該如何自動決定哪個字體文件是最合適的,這樣這個字符串就不會出現被正方形/框替換的字符?

注:

  • 每一個字符串是用一種語言。
  • 字符串顯示在WebView中。
  • 自定義字體的工作,唯一的問題是決定使用哪個字體文件。
  • 而不是一個字體,它可以提供該字符串可接受的字體列表。

不必要的情況下,爲好奇:我想開發這個功能: http://code.google.com/p/ankidroid/issues/detail?id=779


更新:我結束了創建基於Antisquare開源庫關於Mostafa的想法。
它有一個getSuitableFonts方法是非常快速的。

回答

4

Android本身並不能提供足夠的這樣的任務。在Android中加載和渲染字體發生在Skia中,它是用C編寫的。Skia檢測字符是否在字體中找不到,並回退到另一種字體(不是整個字符串)。這就是在Android中顯示日文,希伯來文或阿拉伯文文本的原因,這就是爲什麼這些腳本沒有大膽表情的原因! (他們的字體是通過回退選擇的,後退只能選擇一個字體文件。)

不幸的是,這種機制在API中沒有提供,您必須自行構建類似的東西。這看起來很複雜,但比看起來更容易。所有你需要做的是:

  1. 準備在每個字體文件中可用的字符列表。
  2. 對於每個字符串查找具有更多字符串的字體。

獲取每種字體

你沒有做到這一點對即時在Android應用人物的名單。您可以準備每種字體中的字符列表,並將這些列表放入您的應用中。我之所以這樣說,是因爲使用Android中可能無法使用的工具可以更輕鬆地進行操作。我會在字體應用程序中通過Python腳本來實現這一點(大多數嚴肅的字體工具都有令人敬畏的Python腳本環境),但這些應用程序非常昂貴,適合嚴肅的類型設計人員。由於您是Android開發人員,我推薦使用sfntly,這是一個Java和C++庫。做你需要的東西(獲取字體文件中可用的Unicode字符列表)很容易。This sample適用於CMap表格(將字符保存爲字形映射的表格),並且應該是您的一個很好的起點。

現在有趣的部分是,snftly是在Java中,你可能能夠將它包含在你的Android應用程序中,並自動執行所有操作。這真是太棒了,我建議你先熟悉一下snftly。

選擇字體

前面的部分後你就會有Unicode字符的列表,每一個字體,以及基於這些列表中選擇的字體文件提供的大多數字符的每個字符串是微不足道的。

+3

我將你的想法實現爲開放源代碼:https://github.com/nicolas-raoul/Antisquare我希望很多人都能找到它,使用它並擴展它:-) –

+0

@NicolasRaoul哦,太棒了。很高興它有所幫助,並且很高興您分享了您的解決方案。 – Mostafa

+0

snftly在Android上運行良好。但是使用它會導致更多的問題。有誰知道Skia使用哪個cmap表格?我猜這是全部或一部分Unicode表(請參閱https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html),但它確實很好。 – SurlyDre