Průsvitné systémové panely správným způsobem – napříč úrovněmi API a motivy
Kreslení od okraje k okraji pomocí průsvitných stavových a navigačních panelů ve verzi v21+ s tmavými a světlými motivy.
Tento článek předpokládá, že jste již prošli kapitolu Navigace gesty – kreslení od okraje k okraji (I)
Protože chceme, aby se obsah vykresloval za systémovými pruhy, znamená to, že
- Potřebujeme průsvitné
- Potřebujeme buď tmavé, nebo světlé šrámy pro navigační a stavový pruh podle aktuálního tématu.
Možnost
- Plně konfigurovatelný statusBarColor
Jsme však omezeni použitím tmavších barev, protože ikony statusBaru zůstávají v bílé barvě. - windowTranslucentStatus true přepíše statusBarColor a použije pevný tmavý rámeček, který nelze změnit.
- Plně konfigurovatelný navigationBarColor
Jsme však omezeni na použití tmavších barev, protože navigační tlačítka zůstávají bíle zbarvená. - windowTranslucentNavigation true přepíše navigationBarColor a použije pevný tmavý rámeček, který nelze změnit.
- Ikony stavového řádku &tlačítka navigačního řádku zůstanou vždy světlé.
v23+
- windowLightStatusBar
Povolí, aby ikony stavového řádku byly tmavé
v27+
- windowLightNavigationBar
Povolí, aby tlačítka navigačního řádku byla tmavá.
Řešení
Poznámka: Budeme používat průhlednou barvu statusBarColor. Protože místo toho použijeme k obarvení stavového řádku AppBar. Protože AppBar pokrývá plochu statusBaru, mělo by stačit nastavit příslušné pozadí přímo na AppBar.
Ve vaší implementaci to může být libovolné zobrazení, které je nahoře. Pokud v horní části obrazovky žádné zobrazení není , můžete místo toho použít atribut statsuBarColor. Dá to stejné výsledky.
Základní hodnoty:
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:
- Překopeme windowTranslucentStatus a windowTranslucentNavigation, protože systém použije tmavý šramot, pokud je použijeme.
- Ikony StatusBar a NavigationBar zůstanou bíle zbarvené.
- To znamená, že můžeme použít pouze tmavé pozadí/skripty.
Máme zde 2 možnosti:
Použít různé pozadí pro tmavé a světlé téma.
V případě tmavého tématu bude barvaPovrch tmavá/černá. Podobnou barvu můžeme použít i pro systemBars.
V případě světlého tématu bude colorSurface světlá/bílá. Podobnou barvu nemůžeme použít pro systémové lišty, protože ikony jsou bílé.
Zásadně nemůžeme ve verzi v21-22 dobře zpracovat systémové lišty se světlým tématem. Takže nám zbývá použít pouze tmavé pozadí .
Použít stejné pozadí pro tmavá i světlá témata.
Můžeme pracovat tak, že použijeme tmavé pozadí pro tmavá i světlá témata.
Výsledkem bude, že tmavé téma bude zářit.
V případě světlého tématu:
Protože tento tmavý šramot bude aplikován i na AppBar (pokud za ním kreslíme, což kreslíme!), budeme muset pro AppBar použít ThemeOverlay.Dark. Jinak budeme mít tmavý text na tmavém pozadí.
values-night
v23 – v26:
U statusBaru můžeme být plně flexibilní, protože máme možnost nechat ikony stavového řádku ztmavnout.
- Pro světlé téma budeme mít světlý status_bar_scrim a tmavý nav_bar_scrim (protože ikony navigace nemohou být tmavé).
- Pro tmavé téma bude values-night přepisovat status_bar_scrim na tmavý a nav_bar_scrim bude následovat status_bar_scrim, aby byl také tmavý.
- Také musíme zabránit tomu, aby náš Widget.AppTheme.AppBar byl vždy tmavý.
hodnoty-v23
v27+:
Můžeme být s navigačním panelem navigationBar plně flexibilní, protože nyní máme možnost, aby ikony navigačního panelu byly tmavé.
Protože values-v23 používá jiný status_bar_scrim a nav_bar_scrim pro světlé téma. Zde se musíme ujistit, že jsou oba stejné (Oba jsou světlé pro světlé téma a oba jsou tmavé pro tmavé téma).
Jen musíme zajistit, aby nav_bar_scrim opět následoval status_bar_scrim, a máme hotovo.
values-v27
Celý kód najdete zde: https://github.com/gaurav414u/MoviesInsetsDemo