Использование коллекции переменных шрифтов Google Noto CJK в приложениях для AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Использование коллекции переменных шрифтов Google Noto CJK в приложениях для Android

Сообщение Anonymous »

Моя конечная цель — загрузить шрифты из файла коллекции переменных шрифтов. Большинство телефонов, продаваемых в Китае, позволяют пользователям использовать пользовательские шрифты в масштабе всей системы (в идеале), но большинство этих шрифтов не имеют полной поддержки иероглифов Unicode CJK, что приводит к несогласованности, поэтому я решил встроить шрифт Noto в свое приложение с самого начала разработки. Я пытаюсь использовать VFC для уменьшения размера APK.
В Compose нет функции Font(), которая принимает индекс TTC, поэтому я попытался определить семейство шрифтов в XML-файле (который поддерживает атрибут android:ttcIndex), прочитать его как Typeface и, наконец, превратить в Compose FontFamily. Сначала я попробовал использовать обычный переменный шрифт, и когда все это было сделано, я обнаружил, что Text() не отображает текст с указанной мной толщиной шрифта, вместо этого возвращается к FontWeight.Normal, если он присутствует в XML шрифта, или к весне шрифта, наиболее близкому к этому.
Я поместил обычный переменный шрифт (переменный шрифт Noto Sans CJK JP) в /res/font, создан файл , содержимое которого приведено ниже: в действии этот XML-файл шрифта преобразуется в шрифт:

Код: Выделить всё

val jp = resources.getFont(R.font.sans_jp)
и, наконец, я установил этот шрифт как семейство шрифтов моего текста:

Код: Выделить всё

import androidx.compose.ui.text.font.FontFamily as ComposeFontFamily

Text(
text = "測試文本",
fontFamily = ComposeFontFamily(jp),
fontWeight = FontWeight(900)
)
Я ожидал, что текст будет отображаться с указанной мной толщиной шрифта (900), но в предварительном просмотре толщина шрифта снова упала до 100 (наименьшая толщина в этом файле), код ниже:

Код: Выделить всё

@Preview
@Composable
private fun TypefacePreview() {
MaterialTheme {
Text(
"測試文本",
fontFamily = ComposeFontFamily(
LocalContext.current.resources.getFont(R.font.sans_jp)
),
fontWeight = FontWeight(900)
)
}
}
а в приложении, работающем на физическом устройстве, толщина шрифта 400.
Кстати, когда Typeface имеет резервную цепочку, состоящую из разных шрифтов с одинаковой толщиной шрифта, проблем нет.
Итак, [EDIT: хотя я знаю, что такая попытка в настоящее время совершенно бессмысленна, потому что этот переменный OTC-файл имеет размер ~ 30 МБ и загружается это вызовет OOM.] Интересно, есть ли какое-то отношение к тому, как Compose внутренне обрабатывает Android Native Typeface.
EDIT: Некоторое время назад я реализовал собственный класс Font и объект AndroidFont.TypefaceLoader. Теперь проблема в том, что коллекция переменных шрифтов составляет более 30 МБ для шрифтов без засечек и более 50 МБ для шрифтов с засечками, что приводит к случайному сбою моего приложения в OOM.

Подробнее здесь: https://stackoverflow.com/questions/797 ... droid-apps
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»