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