Настройте панели управления системы

Для настройки панелей управления используйте комбинацию XML-конфигураций и модулей Dagger для компонентов пользовательского интерфейса.

Определить поведение системной панели

Для определения системной панели используйте тег <SystemBar> в XML-файле, чтобы задать внешний вид и анимацию. Этот XML-файл является частью наложения ресурсов времени выполнения (RRO).

Атрибуты тега SystemBar

Корневым элементом для конфигурации системной панели является <SystemBar> , который поддерживает следующие атрибуты:

Атрибут Статус Описание
id Необходимый Уникальный идентификатор ресурса для системной панели. Например, @id/my_custom_status_bar
type Необходимый Указывает тип системной панели: панель status или navigation
barZOrder Необходимый

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

  • Если вы отображаете системную панель над всплывающим уведомлением, то это значение должно быть больше 10
  • Перекрывающиеся стержни системы не могут иметь одинаковый Z-порядок.
defaultVariant Необходимый Идентификатор варианта <Variant> , применяемого по умолчанию при инициализации системной панели.
displayId Необязательный Идентификатор варианта <Variant> , применяемого по умолчанию при инициализации системной панели.
hideForKeyboard Необязательный

Логическое значение true или false , указывающее, скрывается ли системная панель автоматически при активации программной клавиатуры. По умолчанию это значение равно false .

Если этот атрибут имеет true , необходимо указать переходы _System_Show_Panel и _System_Hide_Panel для системной панели.

dragOpenNotification Необязательный

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

dragCloseNotification Необязательный

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

Идентификаторы и типы системных панелей

Избегайте использования TopCarSystemBar , BottomCarSystemBar , LeftCarSystemBar и RightCarSystemBar в качестве значений id . Система резервирует эти идентификаторы для обеспечения обратной совместимости, и их использование может привести к непредвиденному поведению.

Для базовых настроек верхней строки состояния и нижней панели навигации используйте значения атрибутов type status и nav соответственно.

Если вы используете эти идентификаторы, вы можете пропустить раздел « Предоставление системного интерфейса панели инструментов с помощью Dagger» .

<Variant>
Определяет визуальные состояния. Подробнее см. раздел «Использование варианта для проектирования визуального состояния» . В теге <SystemBar> определите один или несколько тегов <Variant> . Каждый вариант представляет собой отдельное визуальное состояние и содержит свойства, которые управляют внешним видом системной панели в этом состоянии.
<Visibility isVisible="true|false">
Управляет видимостью системной панели. Логическое значение isVisible указывает, видна системная панель или нет.
<Alpha alpha="float_value">
Управляет прозрачностью системной панели. Значение параметра alpha находится в диапазоне от 0.0 (полностью прозрачный) до 1.0 (полностью непрозрачный).
<Bounds .../>

Определяет положение и размер системной панели. Для элементов <SystemBar> их границы должны касаться хотя бы одного края экрана (слева, сверху, справа или снизу). Атрибуты:

  • left , top , right , bottom : Абсолютные координаты.
  • width , height : Размеры.
  • leftOffset , topOffset , rightOffset , bottomOffset : Смещение относительно центра прямоугольника.
<Corner radius="dimen"/>

Определяет радиус скругления углов системной планки. Для radius введите размер радиуса скругления углов.

<Insets .../>

Определяет отступы для системной панели. Атрибуты: left , top , right и bottom . Для каждого атрибута введите значение размера отступа.

<Gravity .../>

Определяет уровень значимости содержимого системной панели. Для получения дополнительной информации см. HunTagXmlParserKt.GRAVITY_TAG в исходном коде.

  • Если значение параметра гравитации не указано, система рассчитает его автоматически.
  • Поддерживаемые значения представляют собой комбинации TOP , BOTTOM , LEFT , RIGHT , CENTER , CENTER_HORIZONTAL , CENTER_VERTICAL и FILL_HORIZONTAL , разделенные символом | .

Единицы измерения

Размеры указываются в px ), децибелах ( dp или dip ), % ) или ссылках на ресурсы dimension , integer , fraction , string или attribute .

Переходы: Анимация между вариантами

Для получения дополнительной информации см. раздел «Настройка перехода» . Используйте блок <Transitions> , чтобы определить, как панель инструментов анимируется при переходе между различными вариантами:

Элемент Атрибут тега
<Transition> fromVariant , toVariant , onEvent , onEventTokens , animator , duration , delay , interpolator
<Transitions> defaultDuration , defaultInterpolator

Scalable UI поддерживает переходы между окнами системных панелей только в том случае, если вы зададите их для сценариев использования в неиммерсивном режиме. Это означает, что иммерсивный режим не запускает оконные переходы Scalable UI для системных панелей при их скрытии (или отображении).

Scalable UI продолжает отправлять события для скрытия (или отображения) системной панели, чтобы другие панели могли реагировать по мере необходимости, в то время как для корректной работы атрибута hideForKeyboard необходимо обеспечить переходы для скрытия и отображения системных панелей. Рассмотрим следующий пример XML-структуры:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
    <Variant id="@+id/hidden_variant" parent="@id/default_variant">
        <Visibility isVisible="false"/>
    </Variant>
    <Transitions>
        <Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
        <Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
    </Transitions>
</SystemBar>

Создайте системную панель пользовательского интерфейса с помощью Dagger.

После определения системной панели в XML-файле укажите фактическое View и Window . Для этого примените переопределение приложения к стандартному модулю Dagger, CarSystemBarModule.java . Например:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Создайте модуль Dagger в переопределении SystemUI.

Для создания пользовательских ресурсов макета используйте классы CarSystemBarViewSupplierUsingLayout и CarSystemBarWindowSupplierUsingLayout .

Создайте модуль Dagger для предоставления ваших пользовательских поставщиков. Параметр @StringKey должен соответствовать id в вашем XML-теге <SystemBar> .

Чтобы переопределить CarSystemBarModule , см. этот пример кода:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Используйте RRO для создания конфигурации на системном уровне.

В файле res/values/config.xml вашего RRO задайте несколько параметров системного уровня, влияющих на системные индикаторы.

Отключить устаревшие системные панели

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

<resources>
    <bool name="config_enableTopSystemBar">false</bool>
    <bool name="config_enableBottomSystemBar">false</bool>
    <bool name="config_enableLeftSystemBar">false</bool>
    <bool name="config_enableRightSystemBar">false</bool>
</resources>

местоположение индикатора конфиденциальности

Строковый ресурс config_privacyIndicatorLocation указывает, на какой панели инструментов системы размещаются индикаторы конфиденциальности. Значение должно быть id объекта <SystemBar> .

<resources>
    <!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
    <string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>

Перетаскивание слушателей событий

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

Рекомендуется: поиск на основе XML (масштабируемый пользовательский интерфейс)

Используйте атрибуты dragOpenNotification и dragCloseNotification непосредственно в теге <SystemBar> внутри XML-файла наложения:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
</SystemBar>

Устаревший режим: Массив ресурсов (резервный вариант)

Если вы поддерживаете сборку пользовательского интерфейса, не поддерживающую масштабируемость, или вам необходимо указать обработчики событий для обратно совместимых устройств, используйте устаревший подход string-array в файле res/values/config.xml в вашем RRO. Эти ресурсы string-array указывают, какие системные панели будут отслеживать события перетаскивания. Например, для открытия панели уведомлений. Каждый <item> — это имя id системной панели.

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

Например:

<resources>
    <string-array name="config_notificationDragOpenListener" translatable="false">
        <item>my_custom_status_bar</item>
    </string-array>
</resources>

Сборка и развертывание

Чтобы создать и развернуть строку состояния:

  1. Прошейте устройство с помощью модифицированного приложения SystemUI.

  2. Используйте систему сборки Android ( m ) для компиляции вашего проекта RRO.

  3. Разверните сгенерированный APK-файл RRO на вашем Android-устройстве. Используйте adb install или прошейте полную сборку, включающую ваш RRO.