Android: узнайте, какой файл шрифта подходит для символов, которые я хочу отобразить - PullRequest
3 голосов
/ 07 октября 2011

Я поддерживаю приложение для Android, которое люди используют для отображения строк на различных экзотических языках, таких как тибетский или древнегреческий. Поскольку устройства Android поставляются с очень небольшим количеством шрифтов, пользователи могут помещать файлы шрифтов на SD-карту, и приложение будет их использовать.

ВОПРОС: Учитывая строку, как я могу автоматически решить, какой файл шрифта является наиболее подходящим, чтобы эта строка отображалась без замены символов на квадраты / квадраты?

Примечания:

  • Каждая строка на одном языке.
  • Строки отображаются в WebView.
  • Пользовательские шрифты работают, единственная проблема - решить, какой файл шрифта использовать.
  • Вместо одного шрифта он может предоставить список шрифтов, приемлемых для этой строки.

Ненужный контекст, для любопытных: я пытаюсь развить эту функцию: http://code.google.com/p/ankidroid/issues/detail?id=779


ОБНОВЛЕНИЕ : В итоге я создал библиотеку Antisquare с открытым исходным кодом, основанную на идее Мостафы.
У него getSuitableFonts метод, который невероятно быстр.

1 Ответ

4 голосов
/ 12 марта 2012

Android сам по себе не предоставляет достаточно для такой задачи.Загрузка и рендеринг шрифтов в Android происходит в Skia, который написан на C. Skia обнаруживает, если символ не может быть найден в шрифте, и обращается к другому шрифту для таких символов (не всей строки).Вот как текст на японском, иврите или арабском языке отображается в Android, и именно поэтому эти сценарии не имеют смелого лица!(Их шрифт выбирается через запасной вариант, а резервный выбирает только один файл шрифта.)

К сожалению, этот механизм не предусмотрен в API, и вам придется создавать подобные вещи самостоятельно.Это кажется сложным, но проще, чем кажется.Все, что вам нужно сделать, это:

  1. Подготовить списки символов, доступных в каждом файле шрифта.
  2. Для каждой строки найдите шрифт, содержащий больше символов строки.

Получение списка символов для каждого шрифта

Вам не нужно делать это на лету в приложении для Android.Вы можете подготовить список символов для каждого шрифта и поместить эти списки в свое приложение.Я говорю это потому, что это намного проще с инструментами, которые могут быть недоступны в Android.Я бы сделал это с помощью сценариев Python в приложении шрифтов (большинство серьезных инструментов шрифтов имеют отличные среды сценариев Python), но эти приложения дороги и предназначены для серьезных разработчиков шрифтов.Поскольку вы являетесь разработчиком Android, я рекомендую использовать sfntly , библиотеку на Java и C ++.Делать то, что вам нужно (получить список символов Юникода, доступных в файле шрифта) легко с помощью sfntly. Этот пример работает с таблицами CMap (таблицами, которые содержат отображение символов на глифы) и должен стать для вас хорошей отправной точкой.

Теперь интересная часть заключается в том, что snftly находится в Java, и вы можетеиметь возможность включить это в ваше приложение для Android и делать все автоматически.Это здорово, я рекомендую вам начать с знакомства с snftly.

Выбор шрифта

После предыдущей части у вас будет список символов Unicode для каждого шрифтаи на основании этих списков выбор файла шрифта, который содержит большинство символов каждой строки, тривиален.

...