تحدّد إرشادات تصميم تطبيقات بث تلفزيوني نوعًا من البطاقات
يُسمى البطاقة الكلاسيكية العريضة،
وهي تعرض صورة وكتلة المحتوى الوصفي جنبًا إلى جنب.
عند إنشاء تصاميم ثنائية الأبعاد معقّدة لشاشات التلفزيون، يمكن أن يؤدي استخدام تحديد المواضع التقليدي المستند إلى الإحداثيات أو حاويات Row وColumn المتداخلة بشكل كبير إلى صعوبة قراءة الرمز البرمجي وصيانته وإعادة تصنيعه.
تُعدّ بطاقة Wide classic حالة استخدام مثالية لواجهة برمجة التطبيقات Grid في Jetpack Compose، ما يساعدك في تنظيم العناصر جنبًا إلى جنب بشكل واضح باستخدام مساحات التنسيق الثنائي الأبعاد الدلالية التي يحدّدها المستخدم.
أفضل الممارسات
نفِّذ تنسيق البطاقة باستخدام Grid.
يؤدي استخدام الحاوية Grid إلى تحسين سهولة قراءة الرمز البرمجي
من خلال فصل أبعاد التنسيق الفعلي عن موضع العنصر التابع.
بدلاً من الاعتماد على فهارس المسارات الدقيقة،
حدِّد مناطق مُسمّاة دلاليًا باستخدام الدالة area
وضَع عناصر قابلة للإنشاء تابعة باستخدام المعدِّل gridItem.
يمكنك الجمع بين أحجام المسارات المرنة، مثل GridTrackSize.Auto وminmax(0.dp, 1.fr)، مع فجوات المسارات الدقيقة (gap(row = 8.dp, column = 16.dp)) لتنظيم مكوّنات البطاقات المعقّدة جنبًا إلى جنب بشكل واضح وقوي.
المكوّنات
-
Grid: تصميم حاوية ثنائية الأبعاد في Jetpack Compose لترتيب العناصر القابلة للإنشاء التابعة في صفوف وأعمدة استنادًا إلى دالة lambda خاصة بالإعداد -
gridItem: إضافةModifierتربط عنصرًا ثانويًا في واجهة المستخدم بعنصرareaIdمحدّد الاسم داخل تنسيقGrid area: دالة DSL خاصة بالإعدادات ضمنGridConfigurationScopeتربطareaIdبنطاقات أو مدى صفوف وأعمدة معيّنة-
Card: دالة مركّبة للحاوية في التصميم المتعدد الأبعاد تجمع بين عناصر واجهة المستخدم ذات الصلة والتصميم -
GridTrackSize.MinMax: هي سمة لتحديد حجم المسار تحدّد حدودًا مرنة (minوmax) لأبعاد الصف أو العمود -
GridTrackSize.Auto: سمة لتحديد حجم المسار، وتعمل على تحديد حجم صف أو عمود المسار تلقائيًا ليتناسب مع المحتوى (column(GridTrackSize.Auto)) -
gap: دالة ضبط تحدّد المسافة العمودية (row) والأفقية (column) بين مسارات الشبكة
الخطوات
حدِّد معرّفات المناطق، واضبط مسارات الشبكة والمناطق، ثم ضَع العناصر القابلة للإنشاء التابعة.
1. تحديد معرّفات المنطقة الدلالية
أولاً، أنشئ تمثيلاً آمنًا من حيث النوع للمناطق داخل تخطيط بطاقة Wide classic. يتجنّب الصف enum أخطاء الكتابة في السلاسل النصية ويوفر أمانًا في وقت الترجمة البرمجية عند ربط المقاطع الموسيقية ووضع العناصر الثانوية.
enum class CardArea { Image, Title, Subtitle, Description, ExtraText, }
2. ضبط مسارات الشبكة الثنائية الأبعاد والمناطق المُسمّاة
داخل Grid العنصر القابل للإنشاء config lambda، حدِّد الأعمدة والصفوف التي تشكّل بنية البطاقة. استخدِم GridTrackSize.Auto لعمود الصور
حتى يتم تضمين عرض الصورة المصغّرة بشكل سليم. استخدِم minmax(0.dp, 1.fr) لعمود المحتوى كي يتوسّع بشكل مرن على عرض البطاقة المتبقي. حدِّد تباعد المسارات باستخدام gap(row = 8.dp, column = 16.dp). ربط معرّفات CardArea
بإحداثيات المسار المادي باستخدام الدالة area
Grid( config = { // Define columns: left column for image, right for content column(GridTrackSize.Auto) column(minmax(0.dp, 1.fr)) // Define row tracks for the vertical content stack row(GridTrackSize.Auto) row(GridTrackSize.Auto) row(GridTrackSize.Auto) row(GridTrackSize.Auto) // Map semantic identifiers to grid coordinates and spans area(CardArea.Image, row = 1, column = 1, rowSpan = 4) area(CardArea.Title, row = 1, column = 2) area(CardArea.Subtitle, row = 2, column = 2) area(CardArea.Description, row = 3, column = 2) area(CardArea.ExtraText, row = 4, column = 2) gap(row = 8.dp, column = 16.dp) } ) { // Child elements placed in Step 3 }
3- وضع عناصر قابلة للإنشاء تابعة باستخدام المعدِّل gridItem
بعد ضبط المسارات والمناطق، ضَع كل عنصر في واجهة المستخدم الفرعية بشكل دلالي بحت باستخدام المعدِّل gridItem. يمكنك تعريف العناصر القابلة للإنشاء الفرعية بأي ترتيب. يضع الحاوية Grid كل عنصر
مباشرةً في المنطقة الثنائية الأبعاد المخصّصة له تلقائيًا.
@Composable fun WideClassicCard( imageContent: @Composable () -> Unit, title: String, subtitle: String, description: String, extraText: String, modifier: Modifier = Modifier, ) { Card(modifier = modifier) { Grid( config = { // Define columns: left column for image, right for content column(GridTrackSize.Auto) column(minmax(0.dp, 1.fr)) // Define row tracks for the vertical content stack row(GridTrackSize.Auto) row(GridTrackSize.Auto) row(GridTrackSize.Auto) row(GridTrackSize.Auto) // Map semantic identifiers to grid coordinates and spans area(CardArea.Image, row = 1, column = 1, rowSpan = 4) area(CardArea.Title, row = 1, column = 2) area(CardArea.Subtitle, row = 2, column = 2) area(CardArea.Description, row = 3, column = 2) area(CardArea.ExtraText, row = 4, column = 2) gap(row = 8.dp, column = 16.dp) }, ) { Box(modifier = Modifier.gridItem(CardArea.Image)) { imageContent() } Text( text = title, style = MaterialTheme.typography.titleLarge, modifier = Modifier .gridItem(CardArea.Title) .padding(top = 16.dp, end = 16.dp), ) Text( text = subtitle, style = MaterialTheme.typography.titleMedium, modifier = Modifier .gridItem(CardArea.Subtitle) .padding(end = 16.dp), ) Text( text = description, style = MaterialTheme.typography.bodyMedium, modifier = Modifier .gridItem(CardArea.Description) .padding(end = 16.dp), ) Text( text = extraText, style = MaterialTheme.typography.labelSmall, modifier = Modifier .gridItem(CardArea.ExtraText) .padding(bottom = 16.dp, end = 16.dp), ) } } }
النتائج
من خلال تنظيم بطاقة Wide Classic باستخدام Grid والمساحات المسماة، يمكنك تحقيق فصل واضح بين مسارات التصميم المادي وإحداثيات المساحات وموضع العناصر الفرعية القابلة للإنشاء.
تتيح لك هذه البنية قراءة التنسيق والحفاظ عليه،
مع اتّباع إرشادات تصميم تطبيقات بث تلفزيوني
لمكوّنات الصور المصغّرة والأوصاف المتجاورة.