Translucent SystemBars the right way – across API levels and themes
Zum Zeichnen von Rand zu Rand mit transluzenten Status- und Navigationsleisten auf v21+ mit dunklen und hellen Themes.
Dieser Artikel geht davon aus, dass Sie bereits Gestennavigation – Von Rand zu Rand gehen (I)
Da wir möchten, dass der Inhalt hinter den Systemleisten gezeichnet wird, bedeutet dies, dass
- Wir brauchen Durchsichtigkeit
- Wir brauchen entweder dunkle oder helle Scrims für die Navigationsleiste und die Statusleiste je nach aktuellem Thema.
Fähigkeit
- Vollständig konfigurierbare statusBarColor
Aber wir sind darauf beschränkt, dunklere Farben zu verwenden, da die statusBar-Icons weiß bleiben. - windowTranslucentStatus true überschreibt statusBarColor und wendet einen festen dunklen Rahmen an, der nicht geändert werden kann.
- Fully configurable navigationBarColor
Aber wir sind auf die Verwendung dunklerer Farben beschränkt, da die Navigationsschaltflächen weiß bleiben. - windowTranslucentNavigation true überschreibt navigationBarColor und wendet einen festen dunklen Rahmen an, der nicht geändert werden kann.
- Statusleistensymbole &Navigationsleistenschaltflächen bleiben immer hell.
v23+
- windowLightStatusBar
Aktiviert, dass die Statusleistensymbole dunkel sind
v27+
- windowLightNavigationBar
Aktiviert, dass die Navigationsleistenschaltflächen dunkel sind.
Lösung
Hinweis: Wir werden eine transparente statusBarColor verwenden. Denn wir werden stattdessen AppBar verwenden, um die statusBar zu färben. Da die AppBar den Bereich der statusBar abdeckt, sollte es ausreichen, den entsprechenden Hintergrund direkt auf AppBar zu setzen.
In Ihrer Implementierung kann dies eine beliebige Ansicht sein, die sich im oberen Bereich befindet. Wenn es keine Ansicht am oberen Rand des Bildschirms gibt, können Sie stattdessen das Attribut statsuBarColor verwenden. Es wird die gleichen Ergebnisse liefern.
Basiswerte:
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:
- Wir verzichten auf windowTranslucentStatus und windowTranslucentNavigation, da das System einen dunklen Scrim anlegt, wenn wir sie verwenden.
- StatusBar und NavigationBar Icons bleiben weiß.
- Das bedeutet, wir können nur dunkle Hintergründe/Scrims verwenden.
Wir haben hier 2 Möglichkeiten:
Verwenden Sie unterschiedliche Hintergründe für dunkle und helle Themen.
Im Falle des dunklen Themas wird die colorSurface dunkel/schwarz sein. Wir können eine ähnliche Farbe auch für systemBars verwenden.
Im Falle eines hellen Themas wird die colorSurface hell/weiß sein. Wir können keine ähnliche Farbe für die Systemleisten verwenden, da die Icons weiß sind.
Grundsätzlich können wir helle Systemleisten in v21-22 nicht sehr gut handhaben. So sind wir mit der Verwendung von dunklen Hintergründen nur links.
Verwenden Sie den gleichen Hintergrund für dunkle und helle Themen.
Wir können unseren Weg durch die Verwendung von dunklen Hintergründen für dunkle und helle Themen arbeiten.
Als Ergebnis wird das dunkle Thema glänzen.
Im Falle des hellen Themas:
Da dieser dunkle Hintergrund auch auf die AppBar angewendet wird (wenn wir dahinter zeichnen, was wir tun!), müssen wir ein ThemeOverlay.Dark für die AppBar verwenden. Sonst haben wir dunklen Text auf dunklem Hintergrund.