[Перевод] Подготовка приложения к Android Q. Часть 2

Перевод статьи подготовлен специально для студентов курса «Android-разработчик. Базовый курс». Также напоминаем о том, что мы продолжаем набор на расширенный курс «Специализация Android-разработчик»

jnf8--c1dp0fowsqumsy7obnvbi.png

О конфиденциальности и безопасности можно прочитать в первой части статьи.


2) User Experiences


а) Навигационные жесты


l683t0nbn6vonb7dbotjerud2wa.gif

В 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


u-dvwcebklqibn25qn99msqrdc4.png

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 ()

nspkfinzrxups6mgjnqaf-rpoza.png
Области системных жестов выделены желтым цветом.

Но что, если мы не хотим перемещать View и хотим разместить некоторый контент в тех зонах жестов, которые могут конфликтовать с приложением? В этих сценариях приложение может определять области, в которых приложение будет сначала обрабатывать событие касания, а не системные жесты. Это можно сделать, передав List<Rect> в API View.setSystemGestureExclusionRects (), представленный в Android Q. Этот метод также доступен в ViewCompat с androidx.core:core:1.1.0.

  • Подводные камни: вы можете отказаться от обработки только жестов «назад». Границы жеста «домой» зарезервированы и не могут быть переопределены. Это сделано потому, что есть только один способ выйти из приложения. Если ваше приложение конфликтует с жестом «домой», используйте WindowInsets.getMandatorySystemGestureInsets(), чтобы получить его границы и сместить ваши View.


б) Темная тема


В течение последнего года мы видели, что многие приложения начали поддерживать темные темы. Android Q добавляет этот переключатель в настройки системы.

Пользователь может включить темную тему тремя способами:

  1. Новый пункт в настройках системы (Настройки → Дисплей → Тема)
  2. Новый пункт в Быстрых Настройках
  3. В зависимости от производителя, можно включить через режим энергосбережения.


Чтобы поддерживать общесистемную конфигурацию Dark Theme, тема вашего приложения по умолчанию должна наследоваться от темы DayNight. Это связывает основную тему приложения с флагами ночного режима, управляемыми системой. Это работает путем извлечения ресурсов из папок квалификатора night.