Barras de sistema translúcidas de la manera correcta – a través de los niveles de la API y los temas
Para dibujar de borde a borde con barras de estado y navegación translúcidas en v21+ con temas oscuros y claros.
Este artículo asume que ya has pasado por Gesture Navigation- Going Edge to Edge (I)
Como queremos que el contenido se dibuje detrás de las barras del sistema, significa que
- Necesitamos translucidez
- Necesitamos mallas oscuras o claras para la barra de navegación y statusBar según el tema actual.
Capacidad
- Color de la barra de estado totalmente configurable
Pero estamos limitados a usar colores más oscuros ya que los iconos de la barra de estado siguen siendo de color blanco. - windowTranslucentStatus true anula el statusBarColor y aplica una capa oscura fija que no se puede cambiar.
- Fully configurable navigationBarColor
Pero estamos limitados a utilizar colores más oscuros ya que los botones de navegación siguen siendo de color blanco. - windowTranslucentNavigation true anula el navigationBarColor y aplica una capa oscura fija que no se puede cambiar.
- Los iconos de la barra de estado & los botones de la barra de navegación siempre permanecen claros.
v23+
- windowLightStatusBar
Habilita que los iconos de la barra de estado sean oscuros
v27+
- windowLightNavigationBar
Habilita que los botones de la barra de navegación sean oscuros.
Solución
Nota: Usaremos un statusBarColor transparente. Porque en su lugar utilizaremos AppBar para colorear la barra de estado. Dado que la AppBar cubre el área de la statusBar, debería ser suficiente para establecer el fondo relevante a AppBar directamente.
En su implementación, esto puede ser cualquier vista que esté en la parte superior. Si no hay ninguna vista en la parte superior de la pantalla , puede utilizar en su lugar el atributo statsuBarColor. Dará los mismos resultados.
Valores base:
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:
- Desechamos windowTranslucentStatus y windowTranslucentNavigation, ya que el sistema aplicará un scrim oscuro si los usamos.
- Los iconos de la barra de estado y la barra de navegación siguen siendo de color blanco.
- Es decir, sólo podemos utilizar fondos/marcas oscuras.
Tenemos 2 opciones aquí:
Utilizar fondos diferentes para temas oscuros y claros.
En caso de tema oscuro el colorSurface será oscuro/negro. Podemos usar un color similar para las systemBars también.
En caso de tema claro, el colorSurface será claro/blanco. No podemos usar un color similar para las barras del sistema ya que los iconos son blancos.
Básicamente, no podemos manejar las barras del sistema de tema claro muy bien en v21-22. Así que nos quedamos con el uso de fondos oscuros solamente.