Используйте загружаемые шрифты

Попробуйте способ создания композиций.
Jetpack Compose — рекомендуемый набор инструментов для создания пользовательского интерфейса для Android. Узнайте, как использовать текст в Compose.

Функция «Загружаемые шрифты» позволяет API запрашивать шрифты у приложения-поставщика вместо того, чтобы включать файлы в приложение или позволять приложению загружать шрифты. Функция «Загружаемые шрифты» доступна на устройствах с Android API версий 14 и выше через библиотеку AndroidX Core.

Сервис Downloadable Fonts предлагает следующие преимущества:

  • Уменьшает размер приложения, тем самым повышая вероятность успешной установки.
  • Улучшает общее состояние системы, поскольку несколько приложений могут использовать один и тот же шрифт через одного поставщика. Это экономит пользователям мобильный трафик, память телефона и дисковое пространство. В этой модели шрифт загружается по сети по мере необходимости.
Для практического ознакомления с загружаемыми шрифтами ознакомьтесь с примером приложения DownloadableFonts .

Как работает функция загрузки шрифтов?

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

Изображение, демонстрирующее основные компоненты процесса совместимости эмодзи.
Рисунок 1. Процесс загрузки шрифтов.

Основы

Функцию «Загружаемые шрифты» можно использовать следующими способами, которые подробно описаны в последующих разделах:

Используйте загружаемые шрифты с Android Studio и сервисами Google Play.

Вы можете настроить приложение на загрузку шрифтов, используя Android Studio 3.0 или более позднюю версию. Чтобы упростить начало работы с функцией загрузки шрифтов, вы можете использовать поставщика шрифтов из сервисов Google Play.

  1. В редакторе макета выберите TextView . Затем в разделе «Атрибуты» выберите fontFamily > «Дополнительные шрифты» .
    Изображение, демонстрирующее редактор макетов Android Studio.
    Рисунок 2. Использование редактора макета .
    Открывается окно «Ресурсы» .
  2. В меню «Источник» выберите «Google Fonts» .
  3. В поле «Шрифты» выберите шрифт в области «Доступные для скачивания».
  4. Выберите «Создать загружаемый шрифт» и нажмите «ОК» .
    Изображение, демонстрирующее, как выбрать шрифты в окне «Ресурсы».
    Рисунок 3. Выбор шрифта в окне «Ресурсы» .
  5. Android Studio автоматически генерирует необходимые XML-файлы для корректного отображения шрифта в вашем приложении.

    Изображение, демонстрирующее предварительный просмотр шрифтов.
    Рисунок 4. Предварительный просмотр файла шрифта.

Используйте загружаемые шрифты программным способом.

Начиная с Android 8.0 (уровень API 26), AndroidX Core обеспечивает полную поддержку загружаемых шрифтов. Для получения дополнительной информации об использовании библиотеки AndroidX Core см. раздел «Загружаемые шрифты» в библиотеке AndroidX Core на этой странице.

Для программного использования функции загружаемых шрифтов взаимодействуйте с двумя ключевыми классами:

Ваше приложение получает шрифты от поставщика шрифтов, используя API FontsContract . Каждый поставщик имеет свой набор ограничений по поддерживаемым версиям Android и языку запросов. Для получения дополнительной информации о версиях Android и формате запросов обратитесь к документации вашего поставщика.

Чтобы скачать шрифт, выполните следующие шаги:

  1. Создайте экземпляр класса android.graphics.fonts.FontRequest для запроса шрифта у поставщика. Для создания запроса передайте следующие параметры:
    • Орган, ответственный за предоставление шрифтов.
    • Пакет поставщика шрифтов для проверки подлинности поставщика.
    • Строковый запрос шрифта. Для получения дополнительной информации о форматах запросов см. документацию вашего поставщика шрифтов, например, Google Fonts .
    • Список наборов хешей для сертификатов, используемых для проверки подлинности поставщика.

    Котлин

    val request = FontRequest(
            "com.example.fontprovider.authority",
            "com.example.fontprovider",
            "my font",
            certs
    )

    Java

    FontRequest request = new FontRequest("com.example.fontprovider",
                       "com.example.fontprovider", "my font", certs);
  2. Создайте экземпляр класса FontsContract.FontRequestCallback .
  3. Переопределите метод onTypefaceRetrieved() , чтобы указать, что запрос шрифта завершен. Укажите полученный шрифт в качестве параметра. Вы можете использовать этот метод для установки шрифта по мере необходимости. Например, вы можете установить шрифт для TextView .
  4. Переопределите метод onTypefaceRequestFailed() , чтобы получать информацию об ошибках в процессе запроса шрифта. Для получения дополнительной информации о кодах ошибок см. константы кодов ошибок .
  5. Вызовите метод FontsContract.requestFont() для получения шрифта от поставщика шрифтов. Метод инициирует проверку наличия шрифта в кэше. Если шрифт недоступен локально, он вызывает поставщика шрифтов, асинхронно получает шрифт и передает результат в функцию обратного вызова. Передайте следующие параметры:
    • Экземпляр класса Context
    • Экземпляр класса android.graphics.fonts.FontRequest
    • Функция обратного вызова для получения результатов запроса шрифта.
    • Обработчик для загрузки шрифтов в отдельном потоке.

Приведенный ниже пример кода иллюстрирует общий процесс загрузки шрифтов:

Котлин

val request = FontRequest(
        "com.example.fontprovider.authority",
        "com.example.fontprovider",
        "my font",
        certs
)
val callback = object : FontsContract.FontRequestCallback() {

    override fun onTypefaceRetrieved(typeface: Typeface) {
        // Your code to use the font goes here.
        ...
    }

    override fun onTypefaceRequestFailed(reason: Int) {
        // Your code to deal with the failure goes here.
        ...
    }
}
FontsContract.requestFonts(context, request, handler, null, callback)

Java

FontRequest request = new FontRequest("com.example.fontprovider.authority",
        "com.example.fontprovider", "my font", certs);
FontsContract.FontRequestCallback callback =
    new FontsContract.FontRequestCallback() {
        @Override
        public void onTypefaceRetrieved(Typeface typeface) {
            // Your code to use the font goes here.
            ...
        }

        @Override
        public void onTypefaceRequestFailed(int reason) {
            // Your code to deal with the failure goes here.
            ...
        }
};
FontsContract.requestFonts(context, request, handler, null, callback);

Для получения более подробной информации о том, как загрузить шрифт от поставщика шрифтов, см. пример приложения DownloadableFonts .

Используйте загружаемые шрифты с ядром AndroidX.

Ядро AndroidX обеспечивает поддержку функции загружаемых шрифтов на устройствах, работающих под управлением Android API версии 14 или выше. Пакет androidx.core.provider содержит классы FontsContractCompat и FontRequest для реализации обратно совместимой поддержки функции загружаемых шрифтов. Классы AndroidX содержат методы, аналогичные методам фреймворка, а процесс загрузки шрифтов аналогичен описанному в разделе на этой странице о программном использовании загружаемых шрифтов .

Для загрузки шрифтов с помощью AndroidX импортируйте классы FontsContractCompat и FontRequest из пакета androidx.core.provider . Создавайте экземпляры этих классов вместо классов фреймворка FontsContract и android.graphics.fonts.FontRequest .

Добавить зависимость ядра AndroidX

Для использования классов FontsContractCompat и FontRequest необходимо изменить зависимости classpath в вашем проекте приложения в среде разработки.

Чтобы добавить AndroidX Core в проект вашего приложения, добавьте следующую зависимость в файл build.gradle вашего приложения:

Классный

dependencies {
    ...
    implementation "androidx.core:core-ktx:1.17.0"
}

Котлин

dependencies {
    ...
    implementation("androidx.core:core-ktx:1.17.0")
}

Используйте загружаемые шрифты в качестве ресурсов в XML.

Android 8.0 (уровень API 26) и AndroidX Core предлагают более быстрый и удобный способ объявления пользовательского шрифта в качестве ресурса в XML-макете. Это означает, что нет необходимости включать шрифт в состав ресурса. Вы можете определить пользовательский шрифт для всей вашей темы, что ускоряет удобство использования для различных вариантов толщины и стиля, таких как жирный, средний или светлый, если таковые имеются.

  1. Создайте новый XML-файл в папке res/font .
  2. Добавьте корневой элемент <font-family> и задайте атрибуты, связанные со шрифтом, как показано в следующем примере XML-файла:
  3. <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:android="http://schemas.android.com/apk/res/android"
            android:fontProviderAuthority="com.example.fontprovider.authority"
            android:fontProviderPackage="com.example.fontprovider"
            android:fontProviderQuery="example font"
            android:fontProviderCerts="@array/certs">
    </font-family>
  4. В XML-файле разметки укажите ссылку на файл как @font/font_file_name . Вы также можете использовать метод getFont() для программного получения файла, например, getFont(R.font.font_file_name) .

Предварительно укажите шрифты в манифесте.

Создание макета и получение ресурсов — синхронные задачи. По умолчанию первая попытка получения шрифтов запускает запрос к поставщику шрифтов, что увеличивает время первой компоновки. Чтобы избежать задержки, вы можете предварительно указать шрифты, которые необходимо получить, в своем манифесте. После того, как система получит шрифт от поставщика, он становится доступен немедленно. Если получение шрифта занимает больше времени, чем ожидалось, система прерывает процесс получения и использует шрифт по умолчанию.

Чтобы предварительно указать шрифты в манифесте, выполните следующие шаги:

  1. Создайте массив ресурсов в файле res/values/arrays.xml и укажите шрифты, которые вы хотите предварительно загрузить.
  2. res/values/arrays.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="preloaded_fonts">
            <item>@font/font1</item>
            <item>@font/font2</item>
        </array>
    </resources>
  3. Используйте meta-data для объявления массива ресурсов в вашем манифесте.
  4. <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />

Добавить сертификаты

Если поставщик шрифтов не предустановлен или вы используете библиотеку AndroidX Core, укажите сертификаты, которыми подписан поставщик шрифтов. Система использует эти сертификаты для проверки подлинности поставщика шрифтов.

Для добавления сертификатов выполните следующие действия:

  1. Создайте строковый массив с данными сертификата. Для получения дополнительной информации о данных сертификата обратитесь к документации вашего поставщика шрифтов.
  2. <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="certs">
           <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>
        </string-array>
    </resources>
  3. Установите атрибут fontProviderCerts равным массиву.
  4. android:fontProviderCerts="@array/certs"

Шрифты, доступные для скачивания в Compose.