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 للحالات التي لا تتطلب العناصر ترتيبًا تسلسليًا. لا يقوم Box بقياسات إضافية لتحديد الموضع، على عكس Row و Column.

التوقيع الأساسي لـ Box

Box تقبل المعاملات modifier و contentAlignment و propagateMinConstraints. يتم تمرير جميع العناصر الفرعية في كتلة content، حيث يمكن أن يكون لكل منها معدّلاته الخاصة.

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 مفيد بشكل خاص في الرسوم المتحركة والمكونات القابلة للسحب، حيث يحتاج العنصر إلى الارتفاع مؤقتًا فوق الباقي. على سبيل المثال، عند سحب بطاقة، يزيد 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. بدون هذا المعدّل، يمكن للعناصر الفرعية أن تمتد خارج Box. وفقًا لـ Material Design Guidelines, 2025، clipToBounds إلزامي عند استخدام Modifier.scale أو Modifier.graphicsLayer داخل Box.

propagateMinConstraints هو معامل Box ينقل قيود الحجم الأدنى إلى العناصر الفرعية. إذا تم تعيينه على true، لا يمكن للعناصر الفرعية أن تكون أصغر من الحجم الأدنى المحدد لـ Box عبر Modifier.size أو Modifier.constrain.

  • Box — حاوية أدنى إذا لم يتم تعيين أحجام ولا توجد عناصر فرعية مع fillMaxSize
  • Modifier.clipToBounds يمنع تسرب المحتوى خارج حدود Box
  • propagateMinConstraints ينقل القيود الدنيا إلى العناصر الفرعية

الأسئلة الشائعة

ما الفرق بين Box و Row و Column؟

Box تكدس العناصر فوق بعضها البعض، بينما Row و Column يرتبانها بالتسلسل. Box مناسب للطبقات والتراكبات، Row للصفوف الأفقية، و Column للقوائم الرأسية.

كيف يمكن محاذاة عنصر واحد في Box بشكل مختلف عن الباقي؟

استخدم Modifier.align لعنصر فرعي معين. هذا المعدّل يتجاوز contentAlignment المحدد لكل Box. على سبيل المثال، Modifier.align(Alignment.BottomEnd) يثبت العنصر في الزاوية السفلية اليمنى.

كيفية إنشاء Box بلون خلفية ونص في المنتصف؟

أنشئ Box مع Modifier.size و Modifier.background، واضبط contentAlignment على Alignment.Center. سيتم توسيط النص داخل Box تلقائيًا دون معدّلات إضافية.

ما هو 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا