استخدِم إيماءات التصغير والتكبير لتوفير محتوى قابل للتوسيع في تطبيقك، فهذه هي الطريقة العادية والمتوافقة مع النظام الأساسي لتحسين إمكانية الوصول، ما يتيح للمستخدمين ضبط حجم النص وعناصر واجهة المستخدم بشكل سهل بما يتناسب مع احتياجاتهم. يمكن لتطبيقك تحديد سلوك مخصّص لتغيير الحجم مع إمكانية التحكّم الدقيق والسلوك السياقي الذي يقدّم تجربة يكتشفها المستخدمون غالبًا بشكل أسرع من ميزة على مستوى النظام، مثل تكبير الشاشة.
اختيار استراتيجية توسيع نطاق
تؤدي الاستراتيجيات الواردة في هذا الدليل إلى إعادة ترتيب واجهة المستخدم وتعديلها لتناسب عرض الشاشة. ويوفّر ذلك ميزة مهمة لتسهيل الاستخدام من خلال إلغاء الحاجة إلى التحريك الأفقي والحركة المزعجة "المتعرّجة" التي قد تكون مطلوبة لقراءة أسطر طويلة من النص.
مزيد من القراءة: تؤكّد الأبحاث أنّ إعادة ترتيب المحتوى تتيح للمستخدمين ضعاف البصر قراءة المحتوى بشكل أسهل بكثير والتنقّل فيه بشكل أفضل من الواجهات التي تتطلّب تحريك المحتوى ثنائي الأبعاد. لمزيد من التفاصيل، يُرجى الاطّلاع على مقارنة بين ميزة "التحريك والتكبير" والمحتوى القابل لإعادة التدفق على الأجهزة الجوّالة.
تغيير حجم جميع العناصر أو عناصر النص فقط
يوضّح الجدول التالي التأثير المرئي لكل استراتيجية من استراتيجيات تغيير الحجم.
| الاستراتيجية | تحجيم الكثافة | تكبير حجم الخط |
|---|---|---|
السلوك |
يتم تغيير حجم كل شيء بشكل متناسب. يتم إعادة ترتيب المحتوى ليناسب الحاوية، وبالتالي لا يحتاج المستخدم إلى التمرير أفقيًا للاطّلاع على كل المحتوى. |
يؤثر ذلك في عناصر النص فقط. يظل التصميم العام والمكوّنات غير النصية بالحجم نفسه. |
أنواع المقاييس |
جميع العناصر المرئية: النص والمكوّنات (الأزرار والرموز) والصور والمسافات بين العناصر (الحشو والهوامش) |
النص فقط |
العرض التوضيحي |
الاقتراحات
بعد أن تعرّفت على الاختلافات المرئية، سيساعدك الجدول التالي في تقييم المزايا والعيوب واختيار الاستراتيجية الأنسب لمحتواك.
نوع واجهة المستخدم |
الاستراتيجية المقترَحة |
الاستدلال |
التنسيقات التي تتطلّب القراءة بشكل مكثّف أمثلة: المقالات الإخبارية وتطبيقات المراسلة |
الكثافة أو تغيير حجم الخط |
يُفضّل استخدام تغيير الحجم حسب الكثافة لتغيير حجم مساحة المحتوى بأكملها، بما في ذلك الصور المضمّنة. يُعدّ تغيير حجم الخط بديلاً بسيطًا إذا كان النص فقط بحاجة إلى تغيير حجمه. |
التنسيقات المنظَّمة بصريًا أمثلة: متاجر التطبيقات، خلاصات وسائل التواصل الاجتماعي |
تغيير كثافة الشاشة |
يحافظ على العلاقات المرئية بين الصور والنصوص في لوحات العرض الدوّارة أو الشبكات. تجنُّب الطبيعة المتدفقة للتمرير الأفقي، ما قد يتعارض مع عناصر التمرير المتداخلة |
رصد إيماءات تغيير الحجم في Jetpack Compose
لإتاحة المحتوى القابل لتغيير الحجم من قِبل المستخدم، يجب أولاً رصد إيماءات اللمس المتعدد. في Jetpack Compose، يمكنك إجراء ذلك باستخدام Modifier.transformable.
المعدِّل transformable هو واجهة برمجة تطبيقات عالية المستوى توفّر zoomChange
الفرق منذ آخر حدث إيماءة. ويؤدي ذلك إلى تبسيط منطق تعديل الحالة إلى التراكم المباشر (على سبيل المثال، scale *= zoomChange)، ما يجعله مثاليًا لاستراتيجيات التوسيع التكيّفي الواردة في هذا الدليل.
أمثلة على عمليات التنفيذ
توضّح الأمثلة التالية كيفية تنفيذ استراتيجيتَي تغيير الحجم حسب الكثافة وتغيير حجم الخط.
تغيير الحجم حسب الكثافة
تؤدي هذه الطريقة إلى تغيير حجم density منطقة في واجهة المستخدم. نتيجةً لذلك، يتم تغيير مقياس جميع القياسات المستندة إلى التنسيق، بما في ذلك المساحة المتروكة والمسافة بين العناصر وأحجام المكوّنات، كما لو أنّ حجم الشاشة أو دقتها قد تغيّرتا. وبما أنّ حجم النص يعتمد أيضًا على الكثافة، يتم أيضًا تغيير حجمه بشكل متناسب. تكون هذه الاستراتيجية فعّالة عندما تريد تكبير جميع العناصر بشكل موحّد ضمن مساحة معيّنة، مع الحفاظ على التناغم المرئي العام ونِسب واجهة المستخدم.
private class DensityScalingState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledDensity(): Density { return Density( currentDensity.density * scaleFactor.floatValue, currentDensity.fontScale ) } }
تكبير حجم الخط
تستهدف هذه الاستراتيجية جمهورًا محدّدًا أكثر، إذ تعدّل عامل fontScale فقط. ونتيجةً لذلك، تتمدد عناصر النص أو تتقلص فقط، بينما تظل جميع مكونات التنسيق الأخرى، مثل الحاويات والهوامش والرموز، بحجم ثابت. هذه الاستراتيجية مناسبة تمامًا لتحسين وضوح النص في التطبيقات التي تتطلب قراءة مكثفة.
class FontScaleState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledFont(): Density { return Density( currentDensity.density, currentDensity.fontScale * scaleFactor.floatValue ) } }
واجهة مستخدم العرض التوضيحي المشتركة
هذا هو العنصر DemoCard القابل للإنشاء المشترَك الذي يستخدمه كلا المثالين السابقين
لتسليط الضوء على سلوكيات التحجيم المختلفة.
@Composable private fun DemoCard() { Card( modifier = Modifier .width(360.dp) .padding(16.dp), shape = RoundedCornerShape(12.dp) ) { Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text("Demo Card", style = MaterialTheme.typography.headlineMedium) var isChecked by remember { mutableStateOf(true) } Row(verticalAlignment = Alignment.CenterVertically) { Text("Demo Switch", Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge) Switch(checked = isChecked, onCheckedChange = { isChecked = it }) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Filled.Person, "Icon", Modifier.size(32.dp)) Spacer(Modifier.width(8.dp)) Text("Demo Icon", style = MaterialTheme.typography.bodyLarge) } Row( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Blue) ) Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Red) ) } Text( "Demo Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit," + " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Justify ) } } }
نصائح واعتبارات
لإنشاء تجربة أكثر سلاسة وسهولة في الاستخدام، ننصحك بما يلي:
- توفير عناصر تحكّم في تغيير الحجم لا تستند إلى الإيماءات: قد يواجه بعض المستخدمين صعوبة في استخدام الإيماءات. لمساعدة هؤلاء المستخدمين، ننصحك بتوفير طريقة بديلة لتعديل المقياس أو إعادة ضبطه لا تعتمد على الإيماءات.
- التصميم لجميع المقاييس: اختبِر واجهة المستخدم مع كل من تغيير الحجم داخل التطبيق وإعدادات الخط أو العرض على مستوى النظام. تأكَّد من أنّ تنسيقات تطبيقك تتكيّف بشكل صحيح بدون أن تتعطّل أو تتداخل أو تخفي المحتوى. مزيد من المعلومات حول كيفية إنشاء تنسيقات متجاوبة