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

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

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

Скачиваемые шрифты обладают следующими преимуществами:

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

Как работают скачиваемые шрифты?

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

Изображение, на котором показаны основные компоненты процесса EmojiCompat
Рисунок 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.
    • Список наборов хешей для сертификатов, которые используются для подтверждения личности поставщика.

    Kotlin

    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
    • Обратный вызов для получения результатов запроса шрифта.
    • Обработчик для получения шрифтов в цепочке

В следующем примере кода показан весь процесс скачивания шрифтов:

Kotlin

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 Core

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

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

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

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

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

Яркий

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

Kotlin

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

Как использовать скачиваемые шрифты в качестве ресурсов в 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"