Развертывание семейства шрифтов .otf в приложении FMX
Я пытаюсь реализовать собственное семейство шрифтов (несколько файлов .otf для разного веса, например, тяжелый, легкий, обычный, сверхлегкий ...) для моего приложения Firemonkey, которое будет развернуто как для Android, так и для iOS.
Реализовать семейство шрифтов на iOS было довольно просто, все, что мне нужно было сделать, это включить их в файл info.plist. При применении шрифта к этикетке в разделе «Шрифт> Семейство» мне нужно только ввести «Имя шрифта», и оно будет применено. Имейте в виду, что настоящего файла «Имя шрифта» нет, есть только «Имя шрифта Heavy» и другие значения.
Дополнительный вопрос, как мне вообще использовать вес шрифта в FMX? Я не нашел никакого свойства для установки веса шрифта.
Однако, если сделать то же самое в Android, результат будет совершенно другим. Я включаю шрифты в развертывание, и ввод «Имя шрифта» вообще не применяется, но если я введу, например, «Имя шрифта Ultralight», тогда будет применен шрифт с таким весом (в то время как на iOS добавление «Ultralight» не действует). Что еще хуже, добавление стилей к шрифту, таких как курсив и полужирный, вообще не применяется на Android, в то время как они применяются в iOS.
Почему эти двое действуют так по-разному и как преодолеть различия, чтобы они отображали одно и то же?
1 ответ
Поддержка пользовательских шрифтов в Android на Delphi FMX была недавно реализована в Sydney 10.4, и в Александрии 11 она все еще находится в зачаточном состоянии. Как вы заметили, вы должны ввести «полное» имя шрифта, чтобы он работал на Android, поскольку официальная поддержка отсутствует. для толщины шрифта еще нет.
Однако вы все равно можете достичь желаемых результатов, отредактировав и перекомпилировав некоторый исходный код, расположенный в файле.
FMX.FontGlyphs.Android.pas
из вашей установки Delphi. Вы можете сделать что-то вроде этого:
- Найдите процедуру
LoadResource
из классаTAndroidFontGlyphManager
. Вы можете увидеть, как FMX ищет шрифты, используя только имя семейства и расширение файла. - Проверьте внутреннюю процедуру и то, как она определяет вес текущего шрифта.
- Следуя логике
CreateTypefaceFromFamilyName
добавьте что-то подобное непосредственно перед инициализацией переменной (не забудьте объявитьFontStyle
):
FontStyle:='';
if not CurrentSettings.Style.Slant.IsRegular and not CurrentSettings.Style.Weight.IsRegular then
FontStyle:=' Bold Italic'
else if not CurrentSettings.Style.Weight.IsRegular then
FontStyle:=' Bold'
else if not CurrentSettings.Style.Slant.IsRegular then
FontStyle:=' Italic';
- Измените задание на
FontFile
из:
TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + '.otf');
к:
TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + FontStyle + '.otf');
(повторите и для .ttf)
Это должно добавить поддержку полужирного , курсива и полужирного курсива для Android. Это может быть дополнительно расширено для поддержки большего количества шрифтов, просто проверьте
TFontWeight
перечислить в единице
FMX.Graphics.pas
.