Обзор функций и API

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

Подробный список добавленных, измененных и удаленных API можно найти в отчете о различиях API . Подробную информацию о добавленных API см. в справочнике по API Android . Для Android 14 найдите API, добавленные на уровне API 34. Чтобы узнать об областях, в которых изменения платформы могут повлиять на ваши приложения, обязательно ознакомьтесь с изменениями в поведении Android 14 для приложений, которые целевой Android 14 и для всех приложений .

Интернационализация

Языковые настройки для каждого приложения

В Android 14 языковые функции каждого приложения , которые были представлены в Android 13 (уровень API 33), расширены следующими дополнительными возможностями:

  • Автоматически генерировать localeConfig приложения . Начиная с Android Studio Giraffe Canary 7 и AGP 8.1.0-alpha07, вы можете настроить свое приложение для автоматической поддержки языковых настроек для каждого приложения . На основе ресурсов вашего проекта плагин Android Gradle создает файл LocaleConfig и добавляет ссылку на него в окончательный файл манифеста, поэтому вам больше не придется создавать или обновлять файл вручную. AGP использует ресурсы в папках res модулей вашего приложения и любых зависимостях модулей библиотеки, чтобы определить локали, которые необходимо включить в файл LocaleConfig .

  • Динамические обновления для localeConfig приложения . Используйте методы setOverrideLocaleConfig() и getOverrideLocaleConfig() в LocaleManager чтобы динамически обновлять список поддерживаемых языков вашего приложения в системных настройках устройства . Используйте эту гибкость, чтобы настроить список поддерживаемых языков для каждого региона, проводить эксперименты A/B или предоставлять обновленный список языков, если ваше приложение использует отправку на стороне сервера для локализации.

  • Видимость языка приложения для редакторов методов ввода (IME) . IME могут использовать метод getApplicationLocales() для проверки языка текущего приложения и сопоставления языка IME с этим языком.

API грамматического изменения

3 миллиарда человек говорят на гендерных языках : языках, в которых грамматические категории, такие как существительные, глаголы, прилагательные и предлоги, изменяются в зависимости от пола людей и предметов, с которыми вы разговариваете или о которых вы говорите. Традиционно во многих гендерных языках мужской грамматический род используется в качестве родового или общего рода по умолчанию.

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

Чтобы помочь вам создать ориентированный на пользователя пользовательский интерфейс для языков с гендерной принадлежностью, в Android 14 представлен API Grammatical Inflection , который позволяет добавить поддержку грамматического рода без рефакторинга приложения.

,

Чтобы помочь вам создать ориентированный на пользователя пользовательский интерфейс для языков с гендерной принадлежностью, в Android 14 представлен API Grammatical Inflection , который позволяет добавить поддержку грамматического рода без рефакторинга приложения.

,

Чтобы помочь вам создать ориентированный на пользователя пользовательский интерфейс для языков с гендерной принадлежностью, в Android 14 представлен API Grammatical Inflection , который позволяет добавить поддержку грамматического рода без рефакторинга приложения.

,

Чтобы помочь вам создать ориентированный на пользователя пользовательский интерфейс для языков с гендерной принадлежностью, в Android 14 представлен API Grammatical Inflection , который позволяет добавить поддержку грамматического рода без рефакторинга приложения.

Региональные предпочтения

Региональные настройки позволяют пользователям персонализировать единицы измерения температуры, первый день недели и системы нумерации. Европеец, живущий в Соединенных Штатах, может предпочесть, чтобы единицы температуры были в градусах Цельсия, а не в Фаренгейте, и чтобы приложения считали понедельник началом недели, а не воскресенье по умолчанию в США.

Новые меню настроек Android для этих настроек предоставляют пользователям доступное и централизованное место для изменения настроек приложений. Эти настройки также сохраняются при резервном копировании и восстановлении. Некоторые API и намерения, такие как getTemperatureUnit и getFirstDayOfWeek , предоставляют вашему приложению доступ для чтения к пользовательским настройкам, поэтому ваше приложение может настроить способ отображения информации. Вы также можете зарегистрировать BroadcastReceiver в ACTION_LOCALE_CHANGED для обработки изменений конфигурации локали при изменении региональных предпочтений.

Чтобы найти эти настройки, откройте приложение «Настройки» и выберите «Система» > «Языки и ввод» > «Региональные настройки» .

Экран региональных настроек в настройках системы Android.
Параметры температуры для региональных предпочтений в настройках системы Android.

Доступность

Нелинейное масштабирование шрифта до 200 %.

Начиная с Android 14, система поддерживает масштабирование шрифта до 200 %, предоставляя пользователям с плохим зрением дополнительные возможности доступа, соответствующие рекомендациям по доступности веб-контента (WCAG) .

Чтобы предотвратить слишком большое масштабирование больших текстовых элементов на экране, система применяет нелинейную кривую масштабирования. Эта стратегия масштабирования означает, что большой текст не масштабируется с той же скоростью, что и меньший текст. Нелинейное масштабирование шрифта помогает сохранить пропорциональную иерархию между элементами разных размеров, одновременно устраняя проблемы с линейным масштабированием текста при высоких степенях (например, обрезание текста или текст, который становится труднее читать из-за чрезвычайно больших размеров дисплея).

Протестируйте свое приложение с помощью нелинейного масштабирования шрифтов

Включите максимальный размер шрифта в настройках специальных возможностей устройства, чтобы протестировать приложение.

Если вы уже используете масштабированные пиксели (sp) для определения размера текста, то эти дополнительные параметры и улучшения масштабирования автоматически применяются к тексту в вашем приложении. Тем не менее, вам все равно следует выполнять тестирование пользовательского интерфейса с включенным максимальным размером шрифта (200%), чтобы убедиться, что ваше приложение правильно применяет размеры шрифта и может использовать шрифты большего размера без ущерба для удобства использования.

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

  1. Откройте приложение «Настройки» и перейдите в «Доступность» > «Размер дисплея и текст» .
  2. Для параметра «Размер шрифта» нажимайте значок плюса (+), пока не будет включена настройка максимального размера шрифта, как показано на изображении, сопровождающем этот раздел.

Используйте масштабированные единицы пикселей (sp) для размеров текста.

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

Не используйте единицы sp для заполнения и не определяйте высоту вида, предполагая неявное заполнение: при нелинейном масштабировании шрифта размеры sp могут быть не пропорциональными, поэтому 4sp + 20sp могут не равняться 24sp.

Перевести масштабированные единицы пикселей (sp)

Используйте TypedValue.applyDimension() для преобразования единиц sp в пиксели и используйте TypedValue.deriveDimension() для преобразования пикселей в sp. Эти методы автоматически применяют соответствующую кривую нелинейного масштабирования.

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

Используйте единицы sp для lineHeight

Всегда определяйте android:lineHeight используя единицы измерения sp вместо dp, чтобы высота строки масштабировалась вместе с текстом. В противном случае, если ваш текст имеет формат sp, а lineHeight — в dp или px, он не масштабируется и выглядит тесным. TextView автоматически корректирует lineHeight , чтобы сохранить заданные пропорции, но только если и textSize , и lineHeight определены в единицах sp.

Камера и медиа

Ультра HDR для изображений

Иллюстрация качества изображения стандартного динамического диапазона (SDR) и расширенного динамического диапазона (HDR).

В Android 14 добавлена ​​поддержка изображений с расширенным динамическим диапазоном (HDR), которые сохраняют больше информации от датчика при съемке фотографии, что обеспечивает яркие цвета и большую контрастность. Android использует формат Ultra HDR , который полностью обратно совместим с изображениями JPEG, что позволяет приложениям беспрепятственно взаимодействовать с изображениями HDR, отображая их в стандартном динамическом диапазоне (SDR) по мере необходимости.

Рендеринг этих изображений в пользовательском интерфейсе в HDR выполняется платформой автоматически, когда ваше приложение соглашается использовать HDR пользовательский интерфейс для своего окна активности либо через запись манифеста , либо во время выполнения путем вызова Window.setColorMode() . Вы также можете захватывать сжатые неподвижные изображения Ultra HDR на поддерживаемых устройствах. Благодаря большему количеству цветов, полученных с датчика, редактирование при публикации может стать более гибким. Gainmap связанный с изображениями Ultra HDR, можно использовать для их рендеринга с помощью OpenGL или Vulkan.

,
Иллюстрация качества изображения стандартного динамического диапазона (SDR) и расширенного динамического диапазона (HDR).

В Android 14 добавлена ​​поддержка изображений с расширенным динамическим диапазоном (HDR), которые сохраняют больше информации от датчика при съемке фотографии, что обеспечивает яркие цвета и большую контрастность. Android использует формат Ultra HDR , который полностью обратно совместим с изображениями JPEG, что позволяет приложениям беспрепятственно взаимодействовать с изображениями HDR, отображая их в стандартном динамическом диапазоне (SDR) по мере необходимости.

Рендеринг этих изображений в пользовательском интерфейсе в HDR выполняется платформой автоматически, когда ваше приложение соглашается использовать HDR пользовательский интерфейс для своего окна активности либо через запись манифеста , либо во время выполнения путем вызова Window.setColorMode() . Вы также можете захватывать сжатые неподвижные изображения Ultra HDR на поддерживаемых устройствах. Благодаря большему количеству цветов, полученных с датчика, редактирование при публикации может стать более гибким. Gainmap связанный с изображениями Ultra HDR, можно использовать для их рендеринга с помощью OpenGL или Vulkan.

Масштабирование, фокусировка, постпросмотр и многое другое в расширениях камеры.

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

  • Динамическая оценка задержки обработки кадров обеспечивает гораздо более точную оценку задержки захвата фотографий на основе текущей сцены и условий окружающей среды. Вызовите CameraExtensionSession.getRealtimeStillCaptureLatency() чтобы получить объект StillCaptureLatency , имеющий два метода оценки задержки. Метод getCaptureLatency() возвращает расчетную задержку между onCaptureStarted и onCaptureProcessStarted() , а метод getProcessingLatency() возвращает расчетную задержку между onCaptureProcessStarted() и доступным окончательным обработанным кадром.
  • Поддержка обратных вызовов процесса захвата, чтобы приложения могли отображать текущий ход длительных операций обработки неподвижного захвата. Вы можете проверить, доступна ли эта функция, с помощью CameraExtensionCharacteristics.isCaptureProcessProgressAvailable , и если да, вы реализуете обратный вызов onCaptureProcessProgressed() , в котором в качестве параметра передается прогресс (от 0 до 100).
  • Метаданные, специфичные для расширения, такие как CaptureRequest.EXTENSION_STRENGTH для набора величины эффекта расширения, например степени размытия фона с помощью EXTENSION_BOKEH .

  • Функция Postview для захвата фотографий в расширениях камеры, которая обеспечивает менее обработанное изображение быстрее, чем окончательное изображение. Если расширение имеет увеличенную задержку обработки, изображение после просмотра может быть предоставлено в качестве заполнителя для улучшения UX и позже отключено для окончательного изображения. Вы можете проверить, доступна ли эта функция, с помощью CameraExtensionCharacteristics.isPostviewAvailable . Затем вы можете передать OutputConfiguration в ExtensionSessionConfiguration.setPostviewOutputConfiguration .

  • Поддержка SurfaceView обеспечивающая более оптимизированный и энергоэффективный путь предварительного просмотра.

  • Поддержка касания для фокусировки и масштабирования во время использования расширения.

Встроенный зум

Если REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE в CameraCharacteristics содержит SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW , ваше приложение может использовать расширенные возможности датчика, чтобы предоставить обрезанному потоку RAW те же пиксели, что и полное поле зрения, используя CaptureRequest с целевым объектом RAW, для которого установлен вариант использования потока CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW _CASES_CROPPED_RAW . Благодаря реализации элементов управления переопределением запроса обновленная камера дает пользователям возможность управлять масштабированием даже до того, как будут готовы другие элементы управления камерой.

USB-аудио без потерь

В Android 14 появилась поддержка аудиоформатов без потерь для аудиофильского уровня через проводные USB-гарнитуры. Вы можете запросить у USB-устройства предпочтительные атрибуты микшера, зарегистрировать прослушиватель изменений в предпочтительных атрибутах микшера и настроить атрибуты микшера с помощью класса AudioMixerAttributes . Этот класс представляет формат, такой как маска канала, частота дискретизации и поведение аудиомикшера. Класс позволяет отправлять аудио напрямую , без микширования, регулировки громкости или обработки эффектов.

Производительность и инструменты разработчика

Менеджер учетных данных

В Android 14 добавлен диспетчер учетных данных в качестве API платформы с дополнительной поддержкой устройств Android 4.4 (уровень API 19) через библиотеку Jetpack с использованием сервисов Google Play. Диспетчер учетных данных призван упростить вход в систему для пользователей с помощью API, которые извлекают и сохраняют учетные данные с помощью поставщиков учетных данных, настраиваемых пользователем. Диспетчер учетных данных поддерживает несколько методов входа, включая имя пользователя и пароль, ключи доступа и решения для федеративного входа (например, вход с помощью Google) в одном API.

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

Дополнительные сведения см. в документации по диспетчеру учетных данных и ключам доступа, а также в записи блога о диспетчере учетных данных и ключах доступа .

Здоровье Connect

Health Connect — это встроенное в устройство хранилище данных о здоровье и фитнесе пользователей. Это позволяет пользователям обмениваться данными между своими любимыми приложениями, используя единое место для управления тем, какими данными они хотят делиться с этими приложениями.

На устройствах под управлением версий Android до Android 14 Health Connect можно загрузить в виде приложения в магазине Google Play. Начиная с Android 14, Health Connect является частью платформы и получает обновления через обновления системы Google Play, не требуя отдельной загрузки. Благодаря этому Health Connect может часто обновляться, и ваши приложения могут рассчитывать на то, что Health Connect будет доступен на устройствах под управлением Android 14 или более поздней версии. Пользователи могут получить доступ к Health Connect из настроек своего устройства, а элементы управления конфиденциальностью интегрированы в настройки системы.

Пользователи могут начать использовать Health Connect без отдельной загрузки приложения на устройствах под управлением Android 14 или более поздней версии.
Пользователи могут контролировать, какие приложения имеют доступ к данным о их здоровье и фитнесе, через настройки системы.

Health Connect включает в себя несколько новых функций в Android 14, таких как маршруты тренировок, позволяющие пользователям делиться маршрутом своей тренировки, который можно визуализировать на карте. Маршрут определяется как список мест, сохраненных в течение определенного периода времени, и ваше приложение может вставлять маршруты в сеансы тренировок, связывая их вместе. Чтобы обеспечить полный контроль над этими конфиденциальными данными, пользователи должны разрешить совместное использование отдельных маршрутов с другими приложениями.

Дополнительные сведения см. в документации Health Connection и в записи блога «Что нового в Android Health» .

Обновления OpenJDK 17

В Android 14 продолжается работа по обновлению основных библиотек Android, чтобы они соответствовали функциям последних выпусков OpenJDK LTS, включая обновления библиотек и поддержку языка Java 17 для разработчиков приложений и платформ.

Включены следующие функции и улучшения:

  • Обновлено около 300 классов java.base для поддержки Java 17.
  • Текстовые блоки , которые вводят многострочные строковые литералы в язык программирования Java.
  • Сопоставление с образцом для экземпляра , которое позволяет рассматривать объект как имеющий определенный тип в instanceof без каких-либо дополнительных переменных.
  • Запечатанные классы , позволяющие ограничить классы и интерфейсы, которые могут их расширять или реализовывать.

Благодаря обновлениям системы Google Play (Project Mainline) более 600 миллионов устройств могут получать последние обновления среды выполнения Android (ART), включающие эти изменения. Это часть нашего обязательства предоставить приложениям более согласованную и безопасную среду на всех устройствах, а также предоставить пользователям новые функции и возможности независимо от версий платформы.

Java и OpenJDK являются товарными знаками или зарегистрированными товарными знаками Oracle и/или ее дочерних компаний.

Улучшения для магазинов приложений

Android 14 引入了多个 PackageInstaller API,可帮助应用商店改善其用户体验。

下载之前请求批准安装

安装或更新应用可能需要用户批准。例如,当使用 REQUEST_INSTALL_PACKAGES 权限的安装程序尝试安装新应用时。在之前的 Android 版本中,只有在将 APK 写入安装会话并且提交会话后,应用商店才能请求用户批准。

从 Android 14 开始,requestUserPreapproval() 方法可让安装程序在提交安装会话之前请求用户批准。此项改进可让应用商店将任何 APK 的下载操作推迟到用户批准安装之后。此外,用户批准安装后,应用商店可以在后台下载并安装应用,而不会干扰用户。

承担未来更新的责任

借助 setRequestUpdateOwnership() 方法,安装程序可以向系统表明它打算负责将被安装的应用未来的更新。此 capability 可实现更新所有权强制执行,即仅允许更新所有者为应用安装自动更新。更新所有权强制执行有助于确保用户仅收到来自预期应用商店的更新。

任何其他安装程序(包括使用 INSTALL_PACKAGES 权限的安装程序)都必须获得用户的明确批准,才能安装更新。如果用户决定继续从其他来源安装更新,则会失去更新所有权。

在干扰较少的时段更新应用

应用商店通常希望避免更新正在使用的应用,因为这会导致应用正在运行的进程被终止,而这可能会中断用户正在执行的操作。

从 Android 14 开始,InstallConstraints API 让安装程序可以确保其应用更新在适当的时机进行。例如,应用商店可以调用 commitSessionAfterInstallConstraintsAreMet() 方法来确保仅在用户不再与相应应用互动时才进行更新。

无缝安装可选拆分

借助拆分 APK,应用的功能可以通过单独的 APK 文件提供,而不是以单体式 APK 的形式提供。借助拆分 APK,应用商店可以优化不同应用组件的提供。例如,应用商店可能会根据目标设备的属性进行优化。自在 API 级别 22 中引入以来,PackageInstaller API 一直支持拆分。

在 Android 14 中,setDontKillApp() 方法可让安装程序指明在安装新的拆分项时应用的运行进程不应终止。应用商店可以使用此功能,在用户使用应用时无缝安装应用的新功能。

Пакеты метаданных приложения

Начиная с Android 14, установщик пакетов Android позволяет указать метаданные приложения , например правила безопасности данных, для включения на страницы магазина приложений, например Google Play.

Обнаруживайте, когда пользователи делают снимки экрана устройства

为了打造更加标准化的屏幕截图检测体验,Android 14 引入了可保护隐私的屏幕截图检测 API。借助此 API,应用可以按 activity 注册回调。如果用户在该 activity 可见时截取屏幕截图,系统会调用这些回调并通知用户。

Пользовательский опыт

Дополнительные действия в Sharesheet и улучшенный рейтинг

В Android 14 обновляется общая таблица системы для поддержки настраиваемых действий приложения и более информативных результатов предварительного просмотра для пользователей.

Добавить специальные действия

В Android 14 ваше приложение может добавлять специальные действия в общую таблицу системы, которую оно вызывает.

Скриншот настраиваемых действий на общем листе.

Улучшить рейтинг целей Direct Share

Android 14 использует больше сигналов от приложений для определения рейтинга целей прямого обмена и предоставления более полезных результатов для пользователя. Чтобы обеспечить наиболее полезный сигнал для ранжирования, следуйте инструкциям по улучшению рейтинга ваших целей Direct Share . Коммуникационные приложения также могут сообщать об использовании ярлыков для исходящих и входящих сообщений.

Строка Direct Share в таблице общего доступа, как показано цифрой 1.

Поддержка встроенных и пользовательских анимаций для Predictive Back.

Видео: прогнозирующая анимация спины

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

Android 14 включает в себя множество улучшений и новые рекомендации по функции Predictive Back:

В этой предварительной версии Android 14 все функции Predictive Back остаются за пределами возможностей разработчика. См. руководство для разработчиков, чтобы вернуть приложение на интеллектуальный режим , а также руководство для разработчиков по созданию пользовательских переходов внутри приложения .

Переопределения для каждого приложения производителя устройства с большим экраном

Переопределения для каждого приложения позволяют производителям устройств изменять поведение приложений на устройствах с большим экраном. Например, переопределение FORCE_RESIZE_APP предписывает системе изменить размер приложения в соответствии с размерами дисплея (избегая режима совместимости размеров), даже если в манифесте приложения установлено resizeableActivity="false" .

Переопределения предназначены для улучшения взаимодействия с пользователем на больших экранах.

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

Переопределения для пользователей с большим экраном для каждого приложения

Переопределения для каждого приложения меняют поведение приложений на устройствах с большим экраном. Например, переопределение производителя устройства OVERRIDE_MIN_ASPECT_RATIO_LARGE устанавливает соотношение сторон приложения на 16:9 независимо от конфигурации приложения.

Android 14 QPR1 позволяет пользователям применять переопределения для каждого приложения с помощью нового меню настроек на устройствах с большим экраном.

Совместное использование экрана приложения

Совместное использование экрана приложения позволяет пользователям делиться окном приложения, а не всем экраном устройства во время записи содержимого экрана.

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

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

Умный ответ на базе LLM в Gboard на Pixel 8 Pro

На устройствах Pixel 8 Pro с декабрьским выпуском функций разработчики могут опробовать более качественные интеллектуальные ответы в Gboard на основе встроенных в устройство моделей больших языков (LLM), работающих на Google Tensor.

Эта функция доступна в виде ограниченной предварительной версии для американского английского языка в WhatsApp, Line и KakaoTalk. Для этого необходимо использовать устройство Pixel 8 Pro с Gboard в качестве клавиатуры.

Чтобы опробовать эту функцию, сначала включите эту функцию в «Настройки» > «Параметры разработчика» > «Настройки AiCore» > «Включить Aicore Persistent» .

Затем откройте беседу в поддерживаемом приложении, чтобы увидеть интеллектуальный ответ на базе LLM в полосе предложений Gboard в ответ на входящие сообщения.

Gboard использует LLM на устройстве для предоставления более качественных интеллектуальных ответов.

Графика

Пути доступны для запроса и интерполяции.

API Path Android — это мощный и гибкий механизм для создания и рендеринга векторной графики с возможностью обводки или заливки пути, построения пути из сегментов линий, квадратичных или кубических кривых, выполнения логических операций для получения еще более сложных фигур или все из них одновременно. Одним из ограничений является возможность узнать, что на самом деле находится в объекте Path; внутренности объекта непрозрачны для вызывающих сторон после создания.

Чтобы создать Path , вы вызываете такие методы, как moveTo() , lineTo() и cubicTo() , чтобы добавить сегменты пути. Но у этого пути не было возможности узнать, что представляют собой сегменты, поэтому вы должны сохранить эту информацию во время создания.

Начиная с Android 14, вы можете запрашивать пути, чтобы узнать, что внутри них. Во-первых, вам нужно получить объект PathIterator с помощью API Path.getPathIterator :

Котлин

val path = Path().apply {
    moveTo(1.0f, 1.0f)
    lineTo(2.0f, 2.0f)
    close()
}
val pathIterator = path.pathIterator

Ява

Path path = new Path();
path.moveTo(1.0F, 1.0F);
path.lineTo(2.0F, 2.0F);
path.close();
PathIterator pathIterator = path.getPathIterator();

Затем вы можете вызвать PathIterator для перебора сегментов один за другим, получая все необходимые данные для каждого сегмента. В этом примере используются объекты PathIterator.Segment , которые упаковывают данные за вас:

Котлин

for (segment in pathIterator) {
    println("segment: ${segment.verb}, ${segment.points}")
}

Ява

while (pathIterator.hasNext()) {
    PathIterator.Segment segment = pathIterator.next();
    Log.i(LOG_TAG, "segment: " + segment.getVerb() + ", " + segment.getPoints());
}

PathIterator также имеет версию next() без выделения памяти, в которую вы можете передать буфер для хранения данных точек.

Одним из важных вариантов использования запроса данных Path является интерполяция. Например, вы можете захотеть анимировать (или трансформировать ) между двумя разными путями. Чтобы еще больше упростить этот вариант использования, Android 14 также включает метод interpolate() в Path . Предполагая, что два пути имеют одинаковую внутреннюю структуру, метод interpolate() создает новый Path с этим интерполированным результатом. В этом примере возвращается путь, форма которого находится на полпути (линейная интерполяция .5) между path otherPath :

Котлин

val interpolatedResult = Path()
if (path.isInterpolatable(otherPath)) {
    path.interpolate(otherPath, .5f, interpolatedResult)
}

Ява

Path interpolatedResult = new Path();
if (path.isInterpolatable(otherPath)) {
    path.interpolate(otherPath, 0.5F, interpolatedResult);
}

Библиотека графических путей Jetpack также поддерживает аналогичные API для более ранних версий Android.

Пользовательские сетки с вершинными и фрагментными шейдерами

Android уже давно поддерживает рисование треугольных сеток с настраиваемой заливкой, но формат входной сетки был ограничен несколькими предопределенными комбинациями атрибутов. В Android 14 добавлена ​​поддержка пользовательских сеток , которые можно определить как треугольники или треугольные полосы и при необходимости можно индексировать. Эти сетки задаются с помощью пользовательских атрибутов , шагов вершин, переменных , а также вершинных и фрагментных шейдеров, написанных на AGSL .

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

Аппаратный рендеринг буфера для Canvas

Чтобы помочь в использовании Android Canvas API для рисования с аппаратным ускорением в HardwareBuffer , в Android 14 представлен HardwareBufferRenderer . Этот API особенно полезен, когда ваш вариант использования предполагает связь с системным наборщиком через SurfaceControl для рисования с малой задержкой.