[Перевод] Подготовка приложения к Android Q. Часть 2
Перевод статьи подготовлен специально для студентов курса «Android-разработчик. Базовый курс». Также напоминаем о том, что мы продолжаем набор на расширенный курс «Специализация Android-разработчик»
О конфиденциальности и безопасности можно прочитать в первой части статьи.
2) User Experiences
а) Навигационные жесты
В Android Q Google попытался объединить все жесты навигации с помощью новой навигационной системы жестов, которая заменила плавающую навигационную панель (назад, домой и последние приложения).
- На что влияет: если ваше приложение содержит жесты, то они могут конфликтовать с системными жестами. Это повлияет на все приложения, работающие на Android Q (независимо от целевого SDK), поскольку первыми будут обрабатываться системные жесты.
- Рекомендуемый подход: Поскольку плавающая панель навигации фактически исчезла, рекомендуется в полной мере использовать доступное новое экранное пространство и обеспечить пользователям эффект погружения.
Чтобы создать эффект погружения, приложения должны отображаться за строкой состояния и панелью навигации. Сначала сделаем строку состояния и панель навигации прозрачными.
Далее делаем так, чтобы Activity/View
отображалось на весь экран:
view.systemUiVisibility =
//Layout as if the navigation bar was hidden
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or
//Layout as if the status bar was hidden
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or
//Layout at its most extreme
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
FAB (Floating Action Button, плавающая кнопка действия) перекрывается плавающей панелью навигации. Плавающая панель навигации включена для наглядности.
Теперь, когда приложение отображается в полноэкранном режиме за (прозрачными) системными компонентами, возможно, что какой-то интерактивный компонент приложения перекрывается системным UI. Чтобы решить эту проблему, используйте Insets.
Insets — это набор значений, которые скажут нам, на сколько нужно переместить View, чтобы они не конфликтовали с системным UI. Эта информация предоставляется классом WindowInset. Начиная с API 20, Android предоставляет разработчикам System Window Insets (Insets системных окон), которые сообщают, сколько места занимают компоненты системы (такие как плавающая панель навигации и строка состояния). Эта информация может использоваться для перемещения интерактивных View, чтобы пользователь тапал по нему, а не по системному UI.
root.setOnApplyWindowInsetsListener { _, insets ->
val fabLp = fab.layoutParams as CoordinatorLayout.LayoutParams
fabLp.bottomMargin = fabOriginalBottomMargin + insets.systemWindowInsetBottom
fab.layoutParams = fabLp
insets.consumeSystemWindowInsets()
}
Для FAB задайте слушатель WindowsInsets и примените нижний inset окна в качестве нижнего отступа.
Точно так же, начиная с Android Q, система предоставляет insets навигационных жестов, чтобы перемещать свайпаемые views так, чтобы они не конфликтовали с жестами системы. Они предоставляются через Insets.getSystemGestureInsets ()
Области системных жестов выделены желтым цветом.
Но что, если мы не хотим перемещать View и хотим разместить некоторый контент в тех зонах жестов, которые могут конфликтовать с приложением? В этих сценариях приложение может определять области, в которых приложение будет сначала обрабатывать событие касания, а не системные жесты. Это можно сделать, передав
в API View.setSystemGestureExclusionRects (), представленный в Android Q. Этот метод также доступен в ViewCompat с List<
Rect>
androidx.core:core:1.1.0
.
- Подводные камни: вы можете отказаться от обработки только жестов «назад». Границы жеста «домой» зарезервированы и не могут быть переопределены. Это сделано потому, что есть только один способ выйти из приложения. Если ваше приложение конфликтует с жестом «домой», используйте
WindowInsets.getMandatorySystemGestureInsets()
, чтобы получить его границы и сместить ваши View.
б) Темная тема
В течение последнего года мы видели, что многие приложения начали поддерживать темные темы. Android Q добавляет этот переключатель в настройки системы.
Пользователь может включить темную тему тремя способами:
- Новый пункт в настройках системы (Настройки → Дисплей → Тема)
- Новый пункт в Быстрых Настройках
- В зависимости от производителя, можно включить через режим энергосбережения.
Чтобы поддерживать общесистемную конфигурацию Dark Theme, тема вашего приложения по умолчанию должна наследоваться от темы DayNight. Это связывает основную тему приложения с флагами ночного режима, управляемыми системой. Это работает путем извлечения ресурсов из папок квалификатора night
.