En Glimmer de Jetpack Compose, VerticalStack es un diseño diferido con desplazamiento vertical que organiza los elementos en una secuencia tridimensional que se superpone visualmente. El elemento principal se muestra de forma destacada en primer plano, mientras que los elementos posteriores se ubican detrás de él.
Comportamientos de desplazamiento y posicionamiento
Debido a que las pilas mantienen los elementos organizados en un diseño compacto y superpuesto, tienen algunos comportamientos que son diferentes de otros tipos de componentes secuenciados, como las listas:
- A medida que el usuario se desplaza verticalmente, el elemento activo en primer plano desaparece de la vista, lo que permite que el elemento que se encuentra inmediatamente debajo se deslice a la posición destacada en primer plano.
- Los elementos siempre se animan con una animación de resorte especializada en la posición de primer plano después de que finaliza el gesto del usuario.
- Los elementos se posicionan a lo largo del eje Z, y los elementos que se encuentran más adelante en la lista se colocan detrás del elemento principal.
Administración de focos
El VerticalStack usa un sistema de foco especializado para garantizar que el elemento en primer plano actual siempre sea el objetivo principal de la interacción del usuario:
- Enfoque inicial y reingreso: El enfoque inicial y el reingreso del enfoque se dirigen al elemento superior actual de la pila.
- Notificación de enfoque automático: A medida que los elementos cambian, la pila solicita el enfoque para el elemento superior.
- Seguimiento del enfoque: Cada elemento usa
onFocusChangedpara notificar aStackStatesu estado de enfoque individual.
Ejemplo: Crea una pila vertical
El siguiente código crea una pila vertical con varios elementos:
@Composable fun VerticalStackSample() { VerticalStack(modifier = Modifier.fillMaxWidth().height(364.dp)) { item(key = 0) { Card(modifier = Modifier.fillMaxSize().itemDecoration(CardDefaults.shape)) { Text( "Item-0", style = LocalTextStyle.current.copy(textMotion = TextMotion.Animated), ) } } items(count = 10, key = { it + 1 }) { index -> Card(modifier = Modifier.fillMaxSize().itemDecoration(CardDefaults.shape)) { Text( "Item-${index + 1}", style = LocalTextStyle.current.copy(textMotion = TextMotion.Animated), ) } } } }
Puntos clave sobre el código
- Establece
textMotionpara elLocalTextStyledel texto enAnimated. Esto promueve la renderización fluida del texto durante las animaciones de diseño o las transiciones de escalamiento para evitar artefactos de ajuste de píxeles. - Proporciona un tamaño específico de
364.dppara la altura de la pila vertical. Siempre proporciona una altura específica, usa un modificador de altura o aplica el modificadorfillMaxSizepara definir el área visual de las transiciones de tarjetas. - A diferencia de otros componentes que toman un parámetro de forma directamente,
VerticalStackadministra los límites visuales de sus elementos con el modificadoritemDecoration. En este ejemplo, se pasa la misma forma para elitemDecorationdel elemento inicial que para todos los elementos secundarios para mantener un recorte y efectos visuales coherentes. En este ejemplo, se usa elCardDefaults.shapepredeterminado.