시스템 표시줄 맞춤설정

시스템 표시줄을 맞춤설정하려면 XML 구성과 Dagger 모듈을 UI 구성요소에 함께 사용하세요.

시스템 표시줄 동작 정의

시스템 표시줄을 정의하려면 XML 파일에서 <SystemBar> 태그를 사용하여 모양과 애니메이션을 정의합니다. 이 XML 파일은 런타임 리소스 오버레이(RRO)의 일부입니다.

SystemBar 태그 속성

시스템 표시줄 구성의 루트 요소는 <SystemBar>이며 다음 속성을 지원합니다.

속성 상태 설명
id 필수 시스템 표시줄의 고유 리소스 ID입니다. 예를 들어 @id/my_custom_status_bar
type 필수 시스템 표시줄의 유형을 지정합니다. status 또는 navigation입니다.
barZOrder 필수

시스템 표시줄의 Z-색인을 나타내는 정수입니다. 값이 클수록 시스템에서 다른 항목 위에 표시줄을 그립니다. 양의 정수여야 합니다. 다음 규칙이 적용됩니다.

  • 헤드업 알림 위에 시스템 표시줄을 표시하는 경우 이 값은 10보다 커야 합니다.
  • 겹치는 시스템 표시줄은 Z-색인이 같을 수 없습니다.
defaultVariant 필수 시스템 표시줄이 초기화될 때 기본적으로 적용되는 <Variant>의 ID입니다.
displayId 선택사항 시스템 표시줄이 초기화될 때 기본적으로 적용되는 <Variant>의 ID입니다.
hideForKeyboard 선택사항

소프트웨어 키보드가 활성 상태일 때 시스템 표시줄이 자동으로 숨겨지는지 여부를 나타내는 불리언 값 true 또는 false입니다. 이 속성의 기본값은 false입니다.

이 속성이 true이면 시스템 표시줄에 _System_Show_Panel_System_Hide_Panel 전환을 제공해야 합니다.

dragOpenNotification 선택사항

시스템 표시줄이 알림 패널 열기를 자동으로 트리거하는지 여부를 나타내는 불리언 값 true 또는 false입니다. 이 속성의 기본값은 false입니다.

dragCloseNotification 선택사항

시스템 표시줄이 알림 패널 닫기를 자동으로 트리거하는지 여부를 나타내는 불리언 값 true 또는 false입니다. 이 속성의 기본값은 false입니다.

시스템 표시줄 ID 및 유형

TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar, RightCarSystemBarid 값으로 사용하지 마세요. 시스템은 이전 버전과의 호환성을 위해 이러한 ID를 예약하며 이러한 ID를 사용하면 예기치 않은 동작이 발생할 수 있습니다.

기본 상단 상태 표시줄 및 하단 탐색 표시줄 구성의 경우 type 속성 값으로 각각 statusnav를 사용합니다.

이러한 ID를 사용하는 경우 Dagger로 시스템 표시줄 UI 제공 섹션을 건너뛸 수 있습니다.

<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

확장 가능한 UI는 몰입형이 아닌 모드 사용 사례에 대해 전환을 정의하는 경우에만 시스템 표시줄의 전환을 지원합니다. 즉, 몰입형 모드는 시스템 표시줄을 숨기거나 표시할 때 시스템 표시줄의 확장 가능한 UI 창 전환을 트리거하지 않습니다.

확장 가능한 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로 시스템 표시줄 UI 제공

XML에서 시스템 표시줄을 정의한 후 실제 ViewWindow를 제공합니다. 이렇게 하려면 기본 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
        );
    }
}

SystemUI 재정의에서 Dagger 모듈 만들기

커스텀 레이아웃 리소스를 확장하려면 CarSystemBarViewSupplierUsingLayoutCarSystemBarWindowSupplierUsingLayout 클래스를 사용합니다.

커스텀 제공자를 제공하는 Dagger 모듈을 만듭니다. @StringKey<SystemBar> XML 태그의 id와 일치해야 합니다.

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를 사용하여 시스템 수준 구성 만들기

RRO의 res/values/config.xml 파일에서 시스템 표시줄에 영향을 미치는 여러 시스템 수준 구성을 설정합니다.

기존 시스템 표시줄 사용 중지

확장 가능한 UI와의 충돌을 방지하려면 다음 플래그를 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>

드래그 이벤트 리스너

이러한 구성은 드래그 이벤트를 수신 대기하는 시스템 표시줄을 지정합니다 (예: 아래로 스와이프하여 알림 패널을 엽니다). 확장 가능한 UI가 포함된 Android Automotive OS부터는 이러한 기능을 정의하기 위해 드라이브 탐색 리소스 배열 대신 XML 속성을 기본값으로 사용합니다.

권장사항: XML 기반 탐색 (확장 가능한 UI)

오버레이 XML 내 <SystemBar> 태그에서 dragOpenNotificationdragCloseNotification 속성을 직접 사용합니다.

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

기존: 리소스 배열 (대체)

확장 가능한 UI가 아닌 빌드를 유지관리하거나 이전 버전과 호환되는 기기의 리스너를 지정해야 하는 경우 RRO의 res/values/config.xml에서 기존 string-array 접근 방식을 사용합니다. 이러한 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. 생성된 RRO APK를 Android Automotive 기기에 배포합니다. adb install을 사용하거나 RRO가 포함된 전체 빌드를 플래시합니다.