Skip to content

Edge to edge decorator - is a utility class that is responsible for coloring the statusBar and navigationBar to maintain edge to edge (e2e) mode.

License

Notifications You must be signed in to change notification settings

RedMadRobot/edge-to-edge-decorator

Repository files navigation

edge-to-edge-decorator

ОписаниС

Edge-to-edge-decorator - это класс-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, которая ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅ statusBar ΠΈ navigationBar для поддСрТания edge-to-edge (e2e) Ρ€Π΅ΠΆΠΈΠΌΠ°.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ основана Π½Π° WindowPreferencesManager ΠΈΠ· прилоТСния-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ½ΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π‘ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Android 10, компания Google прСдставила ΠΆΠ΅ΡΡ‚ΠΎΠ²ΡƒΡŽ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ ΠΈ edge-to-edge Ρ€Π΅ΠΆΠΈΠΌ. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ отрисовываСтся ΠΏΠΎΠ΄ систСмными ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ statusBar ΠΈ navigationBar, ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ становится Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±Π΅Π·Ρ€Π°ΠΌΠΎΡ‡Π½Ρ‹ΠΌ, добавляСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Ρ‹Ρ€Π΅Π·ΠΎΠ² для ΠΊΠ°ΠΌΠ΅Ρ€, Π° сами ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ edge-to-edge Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 2 Π²Π΅Ρ‰ΠΈ:

1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ систСмных отступов (insets)

Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ систСмных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ вставляСтС ΠΈΡ… ΠΊΠ°ΠΊ padding Π² вСрстку для Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Insets поддСрТиваСтся всСми вСрсиями Android OS, Ρ‡Ρ‚ΠΎ позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ edge-to-edge для всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚ΠΈΠ½Π° Π¦Ρ…ΠΎΠ²Ρ€Π΅Π±ΠΎΠ²Π°.
Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΎΡ‚ Chris Banes Insetter.

2. ΠΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge для statusBar ΠΈ navigationBar. По Ρ„Π°ΠΊΡ‚Ρƒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ

Π’ΡƒΡ‚ сущСствуСт ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, которая находится Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π² систСмС ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ послС Ρ€Π΅Π»ΠΈΠ·Π° OS ΡƒΠΆΠ΅ нСльзя. Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° ΠΈΠΊΠΎΠ½ΠΎΠΊ Π² систСмных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… (statusBar ΠΈ navigationBar) со свСтлого Π½Π° Ρ‚Π΅ΠΌΠ½Ρ‹ΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π² зависимости ΠΎΡ‚ вСрсии Android:

  • Π΄ΠΎ 6.0 вСрсии android ΠΈΠΊΠΎΠ½ΠΊΠΈ statusBar ΠΈ navigationBar всСгда свСтлыС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ ΠΈΡ… Π² Ρ‚Π΅ΠΌΠ½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ нСльзя.
    Π€Π»Π°Π³ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR доступСн с 23 API. Если Ρƒ вас ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ всСгда Ρ‚Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΎΠΊ Π½Π° Ρ„ΠΎΠ½Π΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, добавляСт Π½Π° систСмныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ„ΠΎΠ½Π° с 50% прозрачности;

  • с вСрсии 6.0 ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ, Π±Π΅Π»Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π² statusBar.
    Однако navigationBar Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях, поэтому Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для statusBar. Π€Π»Π°Π³ View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR доступСн с 26 API.

  • с вСрсии 8.0 ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π±Π΅Π»Ρ‹ΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ для ΠΎΠ±ΠΎΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ налоТСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ edge-to-edge ΠΈ ΠΆΠ΅ΡΡ‚ΠΎΠ²ΡƒΡŽ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ написал Chris Banes.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹

Android 5.0 (API level 21) Android 7.1 (API level 25) Android 9 (API level 28) Android 11 (API level 30)

Как ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ?

1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

dependencies {
    implementation("com.redmadrobot:edge-to-edge-decorator:1.0.0")
}

2. Π’Π΅ΠΌΠ° прилоТСния Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ MaterialComponents

Для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ‚Π΅ΠΌΡ‹ прилоТСния Π² простом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π΅ΠΌΠ° вашСго прилоТСния наслСдовалась ΠΎΡ‚ Theme.MaterialComponents.*.

Π’Π°ΠΊΠΆΠ΅ стоит явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° для AppBarLayout ΠΈ background прилоТСния:

<item name="colorPrimary">@color/colorPrimary</item> <!-- or colorPrimarySurface -->
<item name="android:windowBackground">@color/windowBackground</item>

Или ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свои значСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… appBarColorAttr ΠΈ backgroundColorAttr.

3. Π’Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° edge-to-edge

Если Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ экранС Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ isEdgeToEdgeEnabled = false), Ρ‚ΠΎ Π² Ρ‚Π΅ΠΌΠ΅ прилоТСния слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° statusBar ΠΈ navigationBar:

<item name="android:statusBarColor">@android:color/black</item>
<item name="android:navigationBarColor">@android:color/black</item>

4. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ контрастности для NavigationBar

<item name="android:enforceNavigationBarContrast" tools:targetApi="q">false</item>

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ Ρ„Π»Π°Π³ enforceNavigationBarContrast ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ написал Chris Banes.

5. Настройка ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΏΠΎΠ΄ особСнности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ активация Ρ€Π΅ΠΆΠΈΠΌΠ° edge-to-edge

EdgeToEdgeDecorator
    .updateConfig {
        // custom config
        isEdgeToEdgeEnabled = true
        appBarColorAttr = R.color.colorPrimary
        backgroundColorAttr = R.color.windowBackground
    }
    .apply(context, window)

6. Profit!

Настройки edge-to-edge-decorator

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² 3-Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…:

  1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ (Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ).

    • Π¦Π²Π΅Ρ‚ statusBar ΠΈ navigationBar - ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ;
    • Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ statusBar опрСдСляСтся ΠΏΠΎ Ρ†Π²Π΅Ρ‚Ρƒ AppBarLayout. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ appBarColorAttr (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ R.attr.colorPrimarySurface)
    • Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ navigationBar опрСдСляСтся ΠΏΠΎ Ρ†Π²Π΅Ρ‚Ρƒ Ρ„ΠΎΠ½Π° вашСго прилоТСния. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ backgroundColorAttr (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ android.R.attr.windowBackground).
    • АктивируСтся Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge.
      Π’ window.decorView.systemUiVisibility ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ΠΈ View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
  2. ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ - Π½Π° экранС Π½Π΅Ρ‚ AppBarLayout ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ navigationBar Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ BottomNavigationMenu.

    • Π¦Π²Π΅Ρ‚ statusBar ΠΈ navigationBar - ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ;
    • Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ statusBar опрСдСляСтся ΠΏΠΎ Ρ†Π²Π΅Ρ‚Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ contentUnderStatusBarCustomColor.
    • Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ navigationBar опрСдСляСтся ΠΏΠΎ Ρ†Π²Π΅Ρ‚Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ contentUnderNavBarCustomColor.
    • АктивируСтся Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge.
  3. Π Π΅ΠΆΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠΊΠΎΠΉ контрастности.
    Если Π½Π° экранС Ρ†Π²Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСльзя, Ρ‚ΠΎ для statusBar ΠΈ navigationBar ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ вмСсто ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ statusBarEdgeToEdgeColor ΠΈ navBarEdgeToEdgeColor.

Для всСх Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свои Ρ†Π²Π΅Ρ‚Π° для поддСрТания совмСстимости Π½Π° устройствах с Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌΠΈ вСрсиями Android OS.
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ statusBarCompatibilityColor ΠΈ navBarCompatibilityColor.

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ dsl интСрфСйс для рСдактирования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

override val edgeToEdgeCompatibilityManager = EdgeToEdgeDecorator.updateConfig {
    // custom config
    isEdgeToEdgeEnabled = true
    appBarColorAttr = R.color.colorPrimary
    backgroundColorAttr = R.color.windowBackground
}

ПолноС описаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² классС DefaultConfig

class DefaultConfig {

    /**
     * Π€Π»Π°Π³ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ edge-to-edge Ρ€Π΅ΠΆΠΈΠΌΠ°.
     */
    var isEdgeToEdgeEnabled = true

    /**
     * Π’ простом edge-to-edge Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ statusBar устанавливаСтся Π² соотвСтствии
     * с Ρ†Π²Π΅Ρ‚ΠΎΠΌ [com.google.android.material.appbar.AppBarLayout].
     *
     * Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ [R.attr.colorPrimarySurface].
     *
     * Π’ этом случаС Ρ†Π²Π΅Ρ‚ самого statusBar Ρ€Π°Π²Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ [statusBarEdgeToEdgeColor],
     * ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ [statusBarEdgeToEdgeColor] Ρ€Π°Π²Π΅Π½ [Color.TRANSPARENT].
     *
     * Π’Π°ΠΊΠΆΠ΅ Π² простом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ [backgroundColorAttr]
     *
     * @see backgroundColorAttr
     * @see statusBarEdgeToEdgeColor
     */
    @AttrRes
    var appBarColorAttr = R.attr.colorPrimarySurface

    /**
     * Π’ простом edge-to-edge Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ navigationBar устанавливаСтся Π² соотвСтствии
     * с Ρ†Π²Π΅Ρ‚ΠΎΠΌ [android.R.attr.windowBackground]
     *
     * Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ [android.R.attr.windowBackground]
     *
     * Π’ этом случаС Ρ†Π²Π΅Ρ‚ самого navigationBar Ρ€Π°Π²Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ [navBarCompatibilityColor],
     * ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ [navBarCompatibilityColor] Ρ€Π°Π²Π΅Π½ [Color.TRANSPARENT].
     *
     * Π’Π°ΠΊΠΆΠ΅ Π² простом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ [appBarColorAttr]
     *
     * @see appBarColorAttr
     * @see navBarCompatibilityColor
     */
    @AttrRes
    var backgroundColorAttr = android.R.attr.windowBackground

    /**
     * Если Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ простой Ρ€Π΅ΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для случаСв, ΠΊΠΎΠ³Π΄Π° Π½Π° экранС Π½Π΅Ρ‚
     * [com.google.android.material.appbar.AppBarLayout], ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ кастомный Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge.
     *
     * Для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΏΠΎΠ΄ statusBar, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [R.color.windowBackground]
     *
     * @see contentUnderNavBarCustomColor
     */
    @ColorRes
    var contentUnderStatusBarCustomColor: Int? = null

    /**
     * Если Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ простой Ρ€Π΅ΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄ navigationBar Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Π΅Ρ‚
     * ΠΈΠ»ΠΈ [BottomNavigationMenu], ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ кастомный Ρ€Π΅ΠΆΠΈΠΌ edge-to-edge.
     *
     * Для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΏΠΎΠ΄ navigationBar, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [R.color.bottomMenu]
     *
     * @see contentUnderStatusBarCustomColor
     */
    @ColorRes
    var contentUnderNavBarCustomColor: Int? = null

    /**
     * Если ΠΏΠΎΠ΄ statusBar ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π΅ сплошного Ρ†Π²Π΅Ρ‚Π°, Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°,
     * Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ контрастности.
     *
     * По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ [Color.TRANSPARENT]
     *
     * @see navBarEdgeToEdgeColor
     */
    @ColorInt
    var statusBarEdgeToEdgeColor = Color.TRANSPARENT

    /**
     * Если ΠΏΠΎΠ΄ navigationBar ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π΅ сплошного Ρ†Π²Π΅Ρ‚Π°, Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°,
     * Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ контрастности.
     *
     * По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ [Color.TRANSPARENT]
     *
     * @see statusBarEdgeToEdgeColor
     */
    @ColorInt
    var navBarEdgeToEdgeColor = Color.TRANSPARENT

    /**
     * Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ для statusBar ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с 23 API. Для Android с API Π½ΠΈΠΆΠ΅ 23
     * ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π±Π΅Π»Ρ‹ΠΌΠΈ ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ.
     *
     * По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, для сохранСния эффСкта edge-to-edge, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ с 50% ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ.
     *
     * @see navBarCompatibilityColor
     */
    @ColorInt
    var statusBarCompatibilityColor = ColorUtils.setAlphaComponent(Color.BLACK, 128)

    /**
     * Π¦Π²Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ для navigationBar ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с 26 API. Для Android с API Π½ΠΈΠΆΠ΅ 26
     * ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π±Π΅Π»Ρ‹ΠΌΠΈ ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ.
     *
     * По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, для сохранСния эффСкта edge-to-edge, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ с 50% ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ.
     *
     * @see statusBarCompatibilityColor
     */
    @ColorInt
    var navBarCompatibilityColor = ColorUtils.setAlphaComponent(Color.BLACK, 128)
}

Зависимости

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ зависимости:

implementation("org.jetbrains.kotlin:kotlin-stdlib:1.4.10") // Kotlin
implementation("com.google.android.material:material:1.2.1") // Material components

Feedback

Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ ошибками ΠΈΠ»ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ прСдлоТСния ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ issue.

LICENSE

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

Edge to edge decorator - is a utility class that is responsible for coloring the statusBar and navigationBar to maintain edge to edge (e2e) mode.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published