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

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

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

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

  • Уменьшает размер приложения, тем самым увеличивая вероятность успешной установки приложения.
  • Улучшает общее состояние системы, так как несколько приложений могут совместно использовать один и тот же шрифт через поставщика. Это экономит сотовые данные пользователей, память телефона и дисковое пространство. В этой модели шрифт загружается по сети при необходимости.
Для практического опыта работы со загружаемыми шрифтами ознакомьтесь с примером приложения 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
    )

    Ява

    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 обеспечивает поддержку функции Downloadable Fonts на устройствах с Android API версии 14 или выше. Пакет androidx.core.provider содержит классы FontsContractCompat и FontRequest для реализации поддержки функции Downloadable Fonts с обратной совместимостью. Классы AndroidX содержат методы, аналогичные методам фреймворка, а процесс загрузки шрифтов аналогичен описанному в разделе на этой странице об использовании Downloadable Fonts программным способом .

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

Добавить зависимость AndroidX Core

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

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

Круто

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

Котлин

dependencies {
    ...
    implementation("androidx.core:core-ktx:1.16.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. Ссылайтесь на файл как @font/font_file_name в XML-файле макета. Вы также можете использовать метод 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
Jetpack Compose — рекомендуемый набор инструментов пользовательского интерфейса для Android. Узнайте, как использовать текст в Compose.

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

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

  • Уменьшает размер приложения, тем самым увеличивая вероятность успешной установки приложения.
  • Улучшает общее состояние системы, так как несколько приложений могут совместно использовать один и тот же шрифт через поставщика. Это экономит сотовые данные пользователей, память телефона и дисковое пространство. В этой модели шрифт загружается по сети при необходимости.
Для практического опыта работы со загружаемыми шрифтами ознакомьтесь с примером приложения 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
    )

    Ява

    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 обеспечивает поддержку функции Downloadable Fonts на устройствах с Android API версии 14 или выше. Пакет androidx.core.provider содержит классы FontsContractCompat и FontRequest для реализации поддержки функции Downloadable Fonts с обратной совместимостью. Классы AndroidX содержат методы, аналогичные методам фреймворка, а процесс загрузки шрифтов аналогичен описанному в разделе на этой странице об использовании Downloadable Fonts программным способом .

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

Добавить зависимость AndroidX Core

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

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

Круто

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

Котлин

dependencies {
    ...
    implementation("androidx.core:core-ktx:1.16.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. Ссылайтесь на файл как @font/font_file_name в XML-файле макета. Вы также можете использовать метод 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