Box w Jetpack Compose: co to jest, właściwości composable i jak działa

Autor: IT Sectr Opublikowano: 2026-06-29 Czas czytania: 10 min

Box — to funkcja composable w Jetpack Compose do umieszczania elementów potomnych jeden na drugim na zasadzie warstw. W przeciwieństwie do Row i Column, Box nakłada elementy na jeden obszar, co pozwala tworzyć tekstury, znaczki i niestandardowe wskaźniki. Według Google Android Documentation, 2025, Box jest jednym z trzech podstawowych kontenerów Compose i zapewnia elastyczne zarządzanie warstwami za pomocą Modifier.align i Modifier.zIndex.

Najważniejsze

  • Box — kontener Compose z nakładaniem elementów jeden na drugi, gdzie każdy kolejny element jest rysowany na poprzednim.
  • contentAlignment ustawia wyrównanie całej zawartości Box, a Modifier.align — indywidualne pozycjonowanie każdego elementu potomnego.
  • Modifier.zIndex zarządza kolejnością rysowania elementów, pozwalając podnosić jedne warstwy nad drugie.
  • Box jest używany do nakładania tekstu na obrazy, tworzenia ikon powiadomień, znaczków i podkładów tła.
  • Modifier.clipToBounds ogranicza rysowanie elementów potomnych do granic Box, zapobiegając wychodzeniu zawartości poza kontener.

Czym jest Box w Jetpack Compose

Box — to funkcja composable, która umieszcza elementy potomne w jednym obszarze, nakładając je jeden na drugi. Pierwszy element potomny jest rysowany na dole, ostatni — na górze. Domyślnie Box dopasowuje się do rozmiaru największego elementu potomnego.

W przeciwieństwie do Row i Column, Box nie ustawia elementów sekwencyjnie — wszystkie elementy potomne zajmują ten sam obszar i mogą się nakładać. To czyni Box niezastąpionym do kompozycji warstw interfejsu.

Rozmiar Box jest określany według zasady: jeśli żaden element potomny nie ma stałego rozmiaru, Box zwija się do minimalnego rozmiaru. Jeśli co najmniej jeden element potomny ma Modifier.fillMaxSize, Box rozszerza się do maksymalnego.

Według Android Developers Blog, 2024, Box jest najbardziej wydajnym kontenerem w Compose w przypadkach, gdy elementy nie wymagają sekwencyjnego ułożenia. Box nie wykonuje dodatkowych pomiarów do pozycjonowania, w przeciwieństwie do Row i Column.

Podstawowa sygnatura Box

Box przyjmuje parametry modifier, contentAlignment i propagateMinConstraints. Wszystkie elementy potomne są przekazywane w bloku content, gdzie każdy może mieć własne modyfikatory.

kotlin
@Composable
fun BoxExample() {
    Box(
        modifier = Modifier.size(200.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.fillMaxSize().background(Color.Blue)
        )
        Text(
            text = "Witaj",
            color = Color.White
        )
    }
}

ContentAlignment i Modifier.align w Box

contentAlignment — to parametr Box, który ustawia domyślne wyrównanie dla wszystkich elementów potomnych. Jeśli nie jest określony, używany jest Alignment.TopStart — elementy są umieszczane w lewym górnym rogu kontenera.

Modifier.align pozwala zmienić wyrównanie dla konkretnego elementu potomnego niezależnie od contentAlignment. Na przykład Box z Alignment.Center może zawierać element z Modifier.align(Alignment.BottomEnd), który będzie dociśnięty do prawego dolnego rogu.

Według Material Design Guidelines, 2025, Modifier.align jest przydatny do pozycjonowania znaczków i ikon na obrazach tła. Pozwala to ustawić ogólne wyrównanie dla całej zawartości Box i zmienić je dla poszczególnych elementów.

Tabela wartości Alignment

WartośćPozycja w BoxPrzykład zastosowania
TopStartLewy górny rógIkona w rogu karty
TopCenterGórny środekNagłówek nad obrazem
CenterŚrodek konteneraTekst wyśrodkowany na tle
BottomEndPrawy dolny rógLicznik powiadomień na ikonie
BottomCenterDolny środekPodpis pod obrazem

Przykład z Modifier.align

W tym przykładzie Box zawiera obraz tła i znaczek w prawym dolnym rogu. Modifier.align(BottomEnd) pozycjonuje znaczek niezależnie od contentAlignment całego Box.

kotlin
@Composable
fun BadgeExample() {
    Box(
        modifier = Modifier.size(120.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.size(100.dp).background(Color.Gray)
        )
        Box(
            modifier = Modifier
                .size(30.dp)
                .align(Alignment.BottomEnd)
                .background(Color.Red, CircleShape)
        )
    }
}

Zarządzanie warstwami za pomocą zIndex

Modifier.zIndex zarządza kolejnością rysowania elementów wewnątrz Box. Domyślnie elementy są rysowane w kolejności deklaracji — pierwszy element na dole, ostatni na górze. zIndex zmienia tę kolejność.

Element z zIndex 2.0f jest rysowany nad elementem z zIndex 1.0f, niezależnie od ich kolejności w kodzie. Ujemne wartości zIndex przesuwają element poniżej pozostałych. Według Android Developers, 2024, zIndex wpływa tylko na kolejność rysowania, ale nie na obsługę zdarzeń dotykowych.

zIndex jest szczególnie przydatny w animacjach i komponentach typu draggable, gdzie element musi tymczasowo unieść się nad pozostałymi. Na przykład podczas przeciągania karty jej zIndex jest zwiększany, aby nie była zasłaniana przez sąsiednie elementy.

kotlin
@Composable
fun ZIndexExample() {
    Box(modifier = Modifier.size(150.dp)) {
        Box(modifier = Modifier.size(80.dp)
            .align(Alignment.TopStart)
            .zIndex(2.0f)
            .background(Color.Green))
        Box(modifier = Modifier.size(100.dp)
            .align(Alignment.Center)
            .zIndex(1.0f)
            .background(Color.Blue))
    }
}

Praktyczne przykłady użycia Box

Box jest szeroko stosowany do nakładania tekstu na obraz. Obraz tła jest umieszczany pierwszy, następnie tekst z Modifier.align do pozycjonowania na tle.

kotlin
@Composable
fun ImageWithOverlay() {
    Box(modifier = Modifier.fillMaxWidth().height(200.dp)) {
        Image(
            painter = painterResource(R.drawable.photo),
            contentDescription = "Photo",
            modifier = Modifier.fillMaxSize(),
            contentScale = ContentScale.Crop
        )
        Box(
            modifier = Modifier.fillMaxSize()
                .background(Color.Black.copy(alpha = 0.4f))
        )
        Text(
            text = "Tytuł",
            color = Color.White,
            modifier = Modifier.align(Alignment.BottomStart)
                .padding(16.dp)
        )
    }
}

Drugi przykład — Box do tworzenia wskaźnika ładowania. Box zajmuje cały obszar ekranu, a CircularProgressIndicator jest wyśrodkowany przez contentAlignment.

kotlin
@Composable
fun LoadingOverlay() {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        CircularProgressIndicator(
            modifier = Modifier.size(48.dp)
        )
    }
}

Ograniczenia rozmiarów Box

Box domyślnie dopasowuje się do rozmiaru zawartości. Jeśli elementy potomne mają różne rozmiary, Box przyjmuje rozmiar największego elementu. W przypadku braku elementów potomnych Box zwija się do minimalnego rozmiaru.

Modifier.clipToBounds ogranicza rysowanie elementów potomnych do granic Box. Bez tego modyfikatora elementy potomne mogą wychodzić poza Box. Według Material Design Guidelines, 2025, clipToBounds jest obowiązkowy przy użyciu Modifier.scale lub Modifier.graphicsLayer wewnątrz Box.

propagateMinConstraints — to parametr Box, który przekazuje minimalne ograniczenia rozmiarów elementom potomnym. Jeśli jest ustawiony na true, elementy potomne nie mogą być mniejsze niż minimalny rozmiar Box. To zachowanie jest ważne przy tworzeniu niestandardowych kontenerów ze stałymi minimalnymi rozmiarami.

  • Box — minimalny kontener, jeśli nie określono rozmiarów i nie ma elementów potomnych z fillMaxSize
  • Modifier.clipToBounds zapobiega wychodzeniu zawartości poza granice Box
  • propagateMinConstraints przekazuje minimalne ograniczenia elementom potomnym

Często zadawane pytania

Czym Box różni się od Row i Column?

Box nakłada elementy jeden na drugi, a Row i Column ustawiają je sekwencyjnie. Box nadaje się do warstw i nakładek, Row — do rzędów poziomych, Column — do list pionowych.

Jak wyrównać jeden element w Box inaczej niż pozostałe?

Użyj Modifier.align dla konkretnego elementu potomnego. Ten modyfikator zmienia contentAlignment ustawiony dla całego Box. Na przykład Modifier.align(Alignment.BottomEnd) dociśnie element do prawego dolnego rogu.

Jak zrobić Box z kolorem tła i tekstem wyśrodkowanym?

Ustaw Box z Modifier.size i Modifier.background, a contentAlignment ustaw na Alignment.Center. Tekst wewnątrz Box będzie automatycznie wyśrodkowany bez dodatkowych modyfikatorów.

Czym jest propagateMinConstraints w Box?

propagateMinConstraints przekazuje minimalne ograniczenia rozmiarów Box elementom potomnym. Przy wartości true elementy potomne nie mogą być mniejsze niż minimalny rozmiar ustawiony dla Box przez Modifier.size lub Modifier.constrain.

Jak w Box umieścić element nad innym z kontrolą kolejności?

Kolejność deklaracji elementów w Box określa ich wizualną kolejność: pierwszy element na dole, ostatni — na górze. Do precyzyjnego sterowania użyj Modifier.zIndex — element z większą wartością jest rysowany nad pozostałymi.

Podsumowanie

  • Box — kontener Compose z nakładaniem elementów potomnych jeden na drugi w jednym obszarze, gdzie każdy kolejny element jest rysowany na poprzednim.
  • contentAlignment ustawia domyślne wyrównanie dla wszystkich elementów potomnych, a Modifier.align — indywidualne pozycjonowanie.
  • Modifier.zIndex zarządza kolejnością rysowania warstw, pozwalając podnosić lub opuszczać elementy niezależnie od kolejności deklaracji.
  • Box jest używany do nakładania tekstu na obrazy, tworzenia znaczków, wskaźników ładowania i podkładów tła.
  • Modifier.clipToBounds ogranicza rysowanie elementów potomnych do granic Box, zapobiegając wychodzeniu zawartości poza kontener.
  • propagateMinConstraints przekazuje minimalne ograniczenia elementom potomnym, co jest przydatne przy tworzeniu niestandardowych kontenerów ze stałymi minimalnymi rozmiarami.
  • Do sekwencyjnego układania elementów w poziomie lub pionie używaj Row lub Column, a do warstw i nakładek — Box.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również