طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 251 · برمجة الأجهزة الذكية
الدرس 21 · الوحدة 10: تطوير واجهات مستخدم متقنة

واجهات متقنة: الثيم والتباعد وإمكانية الوصول

من واجهةٍ تعمل إلى واجهةٍ محترفة ومتاحة. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تبني نظام تصميمٍ صغيرًا (ألوان، تباعد، حوافّ).
  • تضمن مساحات لمسٍ مريحة.
  • تحسّن إمكانية الوصول بـ accessibility.

١ما الذي يجعل الواجهة «متقنة»؟

الفرق بين واجهةٍ عاديّة وأخرى محترفة ليس الألوان الزاهية، بل الاتّساق: نظام ألوانٍ وتباعدٍ موحّد، ومساحات لمسٍ مريحة، وإتاحةٌ لكل المستخدمين.

المبدأالتطبيق
نظام ألوان (Tokens)عرّف الألوان مرّةً واستخدم أسماءها
سلّم تباعداستخدم مضاعفات 4 أو 8 (8، 16، 24)
مساحة لمسلا تقلّ عن 44×44 نقطة
إمكانية الوصولaccessibilityLabel للعناصر المهمّة

٢نظام تصميمٍ صغير

نجمع الألوان والتباعد في كائنٍ واحد (نظام تصميم)، فتصبح الواجهة متّسقةً وسهلة التغيير:

import { View, Text, StyleSheet } from 'react-native'; const T = {  color: { brand: '#E8820C', ink: '#1A202C', muted: '#718096', card: '#FFF8F0' },  space: { sm: 8, md: 16, lg: 24 },  radius: 14,}; export default function App() {  return (    <View style={{ padding: T.space.lg }}>      <View style={styles.card}>        <Text style={styles.title}>بطاقة متقنة</Text>        <Text style={styles.body}>ألوانٌ وتباعدٌ من نظامٍ واحد، فكل شيءٍ متناغم.</Text>      </View>    </View>  );} const styles = StyleSheet.create({  card: { backgroundColor: T.color.card, padding: T.space.md, borderRadius: T.radius },  title: { color: T.color.brand, fontSize: 20, fontWeight: 'bold', marginBottom: T.space.sm },  body: { color: T.color.muted, lineHeight: 22 },});

كائن T مصدرٌ واحد للحقيقة. لتغيير الهويّة تعدّل مكانًا واحدًا، فتتبعه الواجهة كلّها.

٣إمكانية الوصول

بعض المستخدمين يعتمدون على قارئ الشاشة. نضيف accessibilityLabel وaccessibilityRole لتصبح العناصر مفهومةً صوتيًّا، ونضمن مساحة لمسٍ كافية:

import { View, Text, Pressable, StyleSheet } from 'react-native'; export default function App() {  return (    <View style={{ padding: 20, gap: 12 }}>      <Text accessibilityRole="header" style={styles.h}>الإعدادات</Text>      <Pressable        accessibilityRole="button"        accessibilityLabel="تفعيل الإشعارات"        style={styles.btn}      >        <Text style={styles.bt}>🔔 الإشعارات</Text>      </Pressable>    </View>  );} const styles = StyleSheet.create({  h: { fontSize: 22, fontWeight: 'bold' },  btn: { minHeight: 48, justifyContent: 'center', paddingHorizontal: 16, backgroundColor: '#E8820C', borderRadius: 12 },  bt: { color: 'white', fontSize: 16 },});

accessibilityRole="header" يجعله عنوانًا لقارئ الشاشة. minHeight: 48 يضمن مساحة لمسٍ مريحة.

توقّع وتحقّق

ما الذي يجعل الواجهة متقنة أكثر؟

سلّم التباعد الجيّد يعتمد:

أقلّ مساحة لمسٍ مريحة:

لإتاحة العنصر لقارئ الشاشة:

الخلاصة

تحدٍّ برمجي: زرّ متاح

متوسط

اصنع زرًّا بمساحة لمسٍ كافية ووصفٍ للوصول.

المطلوب:
  • Pressable بـ accessibilityRole="button" وaccessibilityLabel.
  • ارتفاعٌ لا يقلّ عن 44 (minHeight).
  • داخله <Text testID="label"> نصّه «حفظ».
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء في Console
  • النصّ «حفظ»
  • وصفٌ للوصول
  • مساحة لمسٍ كافية

💡 تلميح 1
أضف accessibilityLabel للزرّ.
💡 تلميح 2
minHeight: 48 يضمن مساحة لمسٍ مريحة.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

import { View, Text, Pressable, StyleSheet } from 'react-native'; export default function App() {  return (    <View style={{ padding: 20 }}>      <Pressable accessibilityRole="button" accessibilityLabel="حفظ التغييرات" style={styles.btn}>        <Text testID="label" style={styles.t}>حفظ</Text>      </Pressable>    </View>  );} const styles = StyleSheet.create({  btn: { minHeight: 48, justifyContent: 'center', alignItems: 'center', backgroundColor: '#E8820C', borderRadius: 12 },  t: { color: 'white', fontSize: 16 },});
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس