Właściwy sposób na półprzezroczyste paski systemowe – na wszystkich poziomach API i w różnych motywach
Do rysowania od krawędzi do krawędzi z półprzezroczystymi paskami stanu i nawigacji w wersji v21+ z ciemnymi i jasnymi motywami.
Ten artykuł zakłada, że przeszedłeś już przez Gesture Navigation- Going Edge to Edge (I)
Ponieważ chcemy, aby zawartość była rysowana za paskami systemowymi, oznacza to, że
- Potrzebujemy półprzezroczystości
- Potrzebujemy albo ciemnych, albo jasnych scrimów dla paska nawigacji i statusBar, zgodnie z bieżącym motywem.
Capability
- W pełni konfigurowalny statusBarColor
Jesteśmy jednak ograniczeni do używania ciemnych kolorów, ponieważ ikony paska statusu pozostają białe. - windowTranslucentStatus true zastąpi statusBarColor i zastosuje stałą ciemną obwódkę, której nie można zmienić.
- W pełni konfigurowalny navigationBarColor
Ale jesteśmy ograniczeni do używania ciemniejszych kolorów, ponieważ przyciski nawigacyjne pozostają w białym kolorze. - windowTranslucentNavigation true zastąpi navigationBarColor i zastosuje stałą ciemną obwódkę, której nie można zmienić.
- Ikony paska stanu &przyciski paska nawigacyjnego zawsze pozostają jasne.
v23+
- windowLightStatusBar
Zezwala na to, aby ikony paska stanu były ciemne
v27+
- windowLightNavigationBar
Zezwala na to, aby przyciski paska nawigacyjnego były ciemne.
Rozwiązanie
Uwaga: Będziemy używać przezroczystego koloru statusBarColor. Ponieważ zamiast tego użyjemy AppBar, aby pokolorować statusBar. Ponieważ AppBar pokrywa obszar statusBar, powinno wystarczyć ustawienie odpowiedniego tła na AppBar bezpośrednio.
W twojej implementacji może to być dowolny widok, który znajduje się na górze. Jeśli nie ma widoku na górze ekranu , możesz zamiast tego użyć atrybutu statsuBarColor. Da to takie same rezultaty.
Wartości bazowe:
AppBarLayout:
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/moviesAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/status_bar_scrim"
android:theme="@style/Widget.AppTheme.AppBar"
app:elevation="2dp"
app:layout_constraintTop_toTopOf="parent"> <androidx.appcompat.widget.Toolbar
android:id="@+id/moviesToolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
app:title="Popular Movies" />
</com.google.android.material.appbar.AppBarLayout>
v21 – v22:
- Odrzucamy windowTranslucentStatus i windowTranslucentNavigation, ponieważ system zastosuje ciemną warstwę, jeśli ich użyjemy.
- Ikony paska stanu i nawigacji pozostają białe.
- To znaczy, że możemy używać tylko ciemnych teł/obramowań.
Mamy tutaj 2 opcje:
Użyj różnych teł dla ciemnych i jasnych motywów.
W przypadku ciemnego motywu kolorPowierzchni będzie ciemny/czarny. Możemy użyć podobnego koloru również dla SystemBars.
W przypadku jasnego motywu, colorSurface będzie light/white. Nie możemy użyć podobnego koloru dla pasków systemowych, ponieważ ikony są białe.
Podstawowo, nie możemy obsługiwać jasnych pasków systemowych bardzo dobrze na v21-22. Więc pozostało nam używanie tylko ciemnych teł .
Używaj tego samego tła dla ciemnych i jasnych motywów.
Możemy pracować po swojemu używając ciemnych teł dla ciemnych i jasnych motywów.
W rezultacie, ciemny motyw będzie błyszczał.
W przypadku jasnego motywu:
Ponieważ ciemny scrim będzie również zastosowany do AppBar (jeśli rysujemy za nim, co robimy!), będziemy musieli użyć ThemeOverlay.Dark dla AppBar. W przeciwnym razie będziemy mieli ciemny tekst na ciemnym tle.
values-night
v23 – v26:
Możemy być w pełni elastyczni ze statusBarem, ponieważ mamy możliwość sprawienia, że ikony paska stanu będą ciemne.
- Dla jasnego motywu, będziemy mieli jasny status_bar_scrim i ciemny nav_bar_scrim (ponieważ ikony nawigacji nie mogą być ciemne).
- Dla ciemnego motywu, values-night zastąpi status_bar_scrim, aby był ciemny, a nav_bar_scrim będzie podążał za status_bar_scrim, aby również był ciemny.
- Musimy również zapobiec temu, aby nasz Widget.AppTheme.AppBar był zawsze ciemny.
values-v23
v27+:
Możemy być w pełni elastyczni z navigationBar, jako że teraz mamy możliwość sprawienia, że ikony paska nawigacji będą ciemne.
Ponieważ values-v23 używa innego status_bar_scrim i nav_bar_scrim dla motywu light. Musimy się tutaj upewnić, że oba są takie same (oba są jasne dla motywu light i oba są ciemne dla motywu dark).
Musimy tylko sprawić, aby nav_bar_scrim ponownie podążał za status_bar_scrim i gotowe.
values-v27
Cały kod można znaleźć tutaj: https://github.com/gaurav414u/MoviesInsetsDemo