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

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

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

Загружаемые шрифты предлагают следующие преимущества:

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

Как работают загружаемые шрифты?

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

Изображения, показывающие основные компоненты процесса совместимости Emoji.
Рисунок 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
    )
    

    Ява

    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)

Ява

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 Core

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

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

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

Чтобы использовать классы FontsContractCompat и FontRequest , необходимо изменить зависимости пути к классам проекта приложения в среде разработки.

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

классный

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

Котлин

dependencies {
    ...
    implementation("androidx.core:core-ktx:2.2.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

Начиная с Compose 1.2-alpha07 , вы можете использовать API загружаемых шрифтов в своем приложении Compose для асинхронной загрузки Google Fonts и использования их в своем приложении. Дополнительную информацию см. в документации по созданию загружаемых шрифтов .