Box در Jetpack Compose: چیست، ویژگی‌های composable و نحوه کار

نویسنده: IT Sectr منتشر شده: 2026-06-29 زمان مطالعه: 10 دقیقه

Box — یک تابع composable در Jetpack Compose برای قرار دادن عناصر فرزند روی هم به صورت لایه‌ای است. برخلاف Row و Column، Box عناصر را روی یک ناحیه قرار می‌دهد که امکان ایجاد بافت‌ها، نشان‌ها و شاخص‌های سفارشی را فراهم می‌کند. به گفته Google Android Documentation, 2025، Box یکی از سه کانتینر پایه Compose است و مدیریت انعطاف‌پذیر لایه‌ها را با Modifier.align و Modifier.zIndex فراهم می‌کند.

نکات اصلی

  • Box — کانتینر Compose با قرارگیری عناصر روی هم، که هر عنصر بعدی روی عنصر قبلی رسم می‌شود.
  • contentAlignment تراز کل محتوای Box را تعیین می‌کند و Modifier.align — موقعیت‌یابی هر عنصر فرزند را.
  • Modifier.zIndex ترتیب رسم عناصر را مدیریت می‌کند و اجازه می‌دهد برخی لایه‌ها روی دیگران قرار گیرند.
  • Box برای قرار دادن متن روی تصاویر، ایجاد نشان اعلان، نشان‌ها و پوشش‌های پس‌زمینه استفاده می‌شود.
  • Modifier.clipToBounds رسم عناصر فرزند را به مرزهای Box محدود می‌کند و از خروج محتوا از کانتینر جلوگیری می‌کند.

Box در Jetpack Compose چیست

Box — یک تابع composable است که عناصر فرزند را در یک ناحیه قرار می‌دهد و آنها را روی هم می‌چیند. اولین عنصر فرزند در پایین و آخرین عنصر در بالا رسم می‌شود. به طور پیش‌فرض Box با اندازه بزرگترین عنصر فرزند تطبیق می‌یابد.

برخلاف Row و Column، Box عناصر را به صورت متوالی قرار نمی‌دهد — همه عناصر فرزند یک ناحیه را اشغال می‌کنند و می‌توانند یکدیگر را بپوشانند. این باعث می‌شود Box برای ترکیب لایه‌های رابط کاربری ضروری باشد.

اندازه Box بر اساس این قانون تعیین می‌شود: اگر هیچ عنصر فرزندی اندازه ثابتی نداشته باشد، Box به حداقل اندازه جمع می‌شود. اگر حداقل یک عنصر فرزند Modifier.fillMaxSize داشته باشد، Box تا حداکثر اندازه گسترش می‌یابد.

به گفته Android Developers Blog, 2024، Box کارآمدترین کانتینر در Compose برای مواردی است که عناصر نیاز به چینش متوالی ندارند. برخلاف Row و Column، Box اندازه‌گیری اضافی برای موقعیت‌یابی انجام نمی‌دهد.

امضای پایه Box

Box پارامترهای modifier، contentAlignment و propagateMinConstraints را می‌پذیرد. همه عناصر فرزند در بلوک content منتقل می‌شوند که هر کدام می‌توانند modifierهای خاص خود را داشته باشند.

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

ContentAlignment و Modifier.align در Box

contentAlignment — پارامتری از Box است که تراز پیش‌فرض را برای همه عناصر فرزند تعیین می‌کند. اگر مشخص نشود، از Alignment.TopStart استفاده می‌شود — عناصر در گوشه بالا سمت چپ کانتینر قرار می‌گیرند.

Modifier.align امکان تغییر تراز یک عنصر فرزند خاص را مستقل از contentAlignment فراهم می‌کند. به عنوان مثال، Box با Alignment.Center می‌تواند عنصری با Modifier.align(Alignment.BottomEnd) داشته باشد که به گوشه پایین سمت راست چسبیده است.

به گفته Material Design Guidelines, 2025، Modifier.align برای قرار دادن نشان‌ها و آیکون‌ها روی تصاویر پس‌زمینه مفید است. این امکان را فراهم می‌کند که تراز کلی برای کل محتوای Box تعیین شده و برای عناصر خاص بازنویسی شود.

جدول مقادیر Alignment

مقدارموقعیت در Boxمثال کاربرد
TopStartگوشه بالا سمت چپآیکون در گوشه کارت
TopCenterمرکز بالاعنوان بالای تصویر
Centerمرکز کانتینرمتن وسط پس‌زمینه
BottomEndگوشه پایین سمت راستشمارنده اعلان روی آیکون
BottomCenterمرکز پایینزیرنویس زیر تصویر

مثال با Modifier.align

در این مثال Box شامل یک تصویر پس‌زمینه و یک نشان در گوشه پایین سمت راست است. Modifier.align(BottomEnd) نشان را مستقل از contentAlignment کل 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)
        )
    }
}

مدیریت لایه‌ها با zIndex

Modifier.zIndex ترتیب رسم عناصر داخل Box را مدیریت می‌کند. به طور پیش‌فرض عناصر به ترتیب اعلام رسم می‌شوند — اولین عنصر در پایین، آخرین در بالا. zIndex این ترتیب را تغییر می‌دهد.

عنصری با zIndex 2.0f روی عنصری با zIndex 1.0f رسم می‌شود، صرف‌نظر از ترتیب آنها در کد. مقادیر منفی zIndex عنصر را پایین‌تر از بقیه قرار می‌دهد. به گفته Android Developers, 2024، zIndex فقط روی ترتیب رسم تأثیر می‌گذارد و نه روی پردازش رویدادهای لمسی.

zIndex به ویژه در انیمیشن‌ها و کامپوننت‌های draggable مفید است، جایی که یک عنصر باید موقتاً از بقیه بالاتر قرار گیرد. مثلاً هنگام کشیدن کارت، zIndex آن افزایش می‌یابد تا توسط عناصر مجاور پوشانده نشود.

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))
    }
}

نمونه‌های عملی استفاده از Box

Box به طور گسترده برای قرار دادن متن روی تصویر استفاده می‌شود. تصویر پس‌زمینه اول قرار می‌گیرد، سپس متن با Modifier.align برای موقعیت‌یابی روی پس‌زمینه.

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 = "عنوان",
            color = Color.White,
            modifier = Modifier.align(Alignment.BottomStart)
                .padding(16.dp)
        )
    }
}

مثال دوم — Box برای ایجاد شاخص بارگذاری. Box کل صفحه را اشغال می‌کند و CircularProgressIndicator با contentAlignment در مرکز قرار می‌گیرد.

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

محدودیت‌های اندازه Box

Box به طور پیش‌فرض با اندازه محتوا تطبیق می‌یابد. اگر عناصر فرزند اندازه‌های مختلفی داشته باشند، Box اندازه بزرگترین عنصر را می‌گیرد. در نبود عناصر فرزند، Box به حداقل اندازه جمع می‌شود.

Modifier.clipToBounds رسم عناصر فرزند را به مرزهای Box محدود می‌کند. بدون این modifier، عناصر فرزند می‌توانند از Box خارج شوند. به گفته Material Design Guidelines, 2025، clipToBounds هنگام استفاده از Modifier.scale یا Modifier.graphicsLayer در داخل Box الزامی است.

propagateMinConstraints — پارامتری از Box است که محدودیت‌های حداقل اندازه را به عناصر فرزند منتقل می‌کند. اگر روی true تنظیم شود، عناصر فرزند نمی‌توانند کوچک‌تر از حداقل اندازه Box باشند. این رفتار هنگام ایجاد کانتینرهای سفارشی با حداقل اندازه ثابت مهم است.

  • Box — حداقل کانتینر در صورت عدم تعیین اندازه و نبود عناصر فرزند با fillMaxSize
  • Modifier.clipToBounds از خروج محتوا از مرزهای Box جلوگیری می‌کند
  • propagateMinConstraints محدودیت‌های حداقل را به عناصر فرزند منتقل می‌کند

سوالات متداول

Box چه تفاوتی با Row و Column دارد؟

Box عناصر را روی هم قرار می‌دهد، در حالی که Row و Column آنها را به صورت متوالی می‌چینند. Box برای لایه‌ها و پوشش‌ها، Row برای ردیف‌های افقی و Column برای لیست‌های عمودی مناسب است.

چگونه یک عنصر را در Box متفاوت از بقیه تراز کنیم؟

از Modifier.align برای عنصر فرزند خاص استفاده کنید. این modifier contentAlignment تعیین شده برای کل Box را بازنویسی می‌کند. مثلاً Modifier.align(Alignment.BottomEnd) عنصر را به گوشه پایین سمت راست می‌چسباند.

چگونه Box با رنگ پس‌زمینه و متن در مرکز ایجاد کنیم؟

Box را با Modifier.size و Modifier.background تنظیم کنید و contentAlignment را روی Alignment.Center قرار دهید. متن داخل Box بدون modifier اضافی به طور خودکار مرکز قرار می‌گیرد.

propagateMinConstraints در Box چیست؟

propagateMinConstraints محدودیت‌های حداقل اندازه Box را به عناصر فرزند منتقل می‌کند. در مقدار true، عناصر فرزند نمی‌توانند کوچک‌تر از حداقل اندازه تعیین شده برای Box با Modifier.size یا Modifier.constrain باشند.

چگونه در Box عنصری را روی دیگری با کنترل ترتیب قرار دهیم؟

ترتیب اعلام عناصر در Box ترتیب بصری آنها را تعیین می‌کند: اولین عنصر در پایین، آخرین — در بالا. برای کنترل دقیق از Modifier.zIndex استفاده کنید — عنصری با مقدار بالاتر روی بقیه رسم می‌شود.

خلاصه

  • Box — کانتینر Compose با قرار دادن عناصر فرزند روی هم در یک ناحیه، که هر عنصر بعدی روی قبلی رسم می‌شود.
  • contentAlignment تراز پیش‌فرض را برای همه عناصر فرزند تعیین می‌کند و Modifier.align — موقعیت‌یابی فردی.
  • Modifier.zIndex ترتیب رسم لایه‌ها را مدیریت می‌کند و اجازه می‌دهد عناصر مستقل از ترتیب اعلام بالا یا پایین قرار گیرند.
  • Box برای قرار دادن متن روی تصاویر، ایجاد نشان‌ها، شاخص‌های بارگذاری و پوشش‌های پس‌زمینه استفاده می‌شود.
  • Modifier.clipToBounds رسم عناصر فرزند را به مرزهای Box محدود می‌کند و از خروج محتوا از کانتینر جلوگیری می‌کند.
  • propagateMinConstraints محدودیت‌های حداقل را به عناصر فرزند منتقل می‌کند که برای ایجاد کانتینرهای سفارشی با حداقل اندازه ثابت مفید است.
  • برای چینش متوالی عناصر به صورت افقی یا عمودی از Row یا Column و برای لایه‌ها و پوشش‌ها از Box استفاده کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید