В Compose нет функции Font(), которая принимает индекс TTC, поэтому я попытался определить семейство шрифтов в XML-файле (который поддерживает атрибут android:ttcIndex), прочитать его как Typeface и, наконец, превратить в Compose FontFamily. Сначала я попробовал использовать обычный переменный шрифт, и когда все это было сделано, я обнаружил, что Text() не отображает текст с указанной мной толщиной шрифта, вместо этого возвращается к FontWeight.Normal, если он присутствует в XML шрифта, или к весне шрифта, наиболее близкому к этому.
Я поместил обычный переменный шрифт (переменный шрифт Noto Sans CJK JP) в /res/font, создан файл , содержимое которого приведено ниже:
Код: Выделить всё
Код: Выделить всё
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)
)
Код: Выделить всё
@Preview
@Composable
private fun TypefacePreview() {
MaterialTheme {
Text(
"測試文本",
fontFamily = ComposeFontFamily(
LocalContext.current.resources.getFont(R.font.sans_jp)
),
fontWeight = FontWeight(900)
)
}
}
Кстати, когда Typeface имеет резервную цепочку, состоящую из разных шрифтов с одинаковой толщиной шрифта, проблем нет.
Итак, [EDIT: хотя я знаю, что такая попытка в настоящее время совершенно бессмысленна, потому что этот переменный OTC-файл имеет размер ~ 30 МБ и загружается это вызовет OOM.] Интересно, есть ли какое-то отношение к тому, как Compose внутренне обрабатывает Android Native Typeface.
EDIT: Некоторое время назад я реализовал собственный класс Font и объект AndroidFont.TypefaceLoader. Теперь проблема в том, что коллекция переменных шрифтов составляет более 30 МБ для шрифтов без засечек и более 50 МБ для шрифтов с засечками, что приводит к случайному сбою моего приложения в OOM.
Подробнее здесь: https://stackoverflow.com/questions/797 ... droid-apps
Мобильная версия