نشرح أساسيات dp (بكسل مستقل عن الكثافة) — وحدة قياس في Android تضمن نفس الحجم الفيزيائي لعناصر واجهة المستخدم على الشاشات بكثافات بكسلات مختلفة. واحد dp يساوي دائمًا 1/160 بوصة على الشاشة، بغض النظر عما إذا كان الجهاز ذو دقة عالية أو منخفضة. وفقًا لـ Google Material Design (2025)، يجب تحديد جميع الأبعاد في تطبيقات Android بـ dp وليس px، وإلا ستبدو الواجهة مختلفة على الأجهزة المختلفة.
النقاط الرئيسية
dp (بكسل مستقل عن الكثافة) هو وحدة قياس افتراضية في Android، تم تقديمها لتوحيد أحجام عناصر واجهة المستخدم على الأجهزة بكثافات بكسلات مختلفة. واحد dp يساوي تقريبًا بكسلًا فيزيائيًا واحدًا على شاشة بكثافة 160 dpi (mdpi). على شاشة بكثافة 320 dpi (xhdpi)، 1 dp يساوي 2 بكسل فيزيائيين. وبالتالي، يظل الحجم الفيزيائي للعنصر على الشاشة كما هو — حوالي 1/160 بوصة. وفقًا لـ Android Developers (2025)، dp هي وحدة القياس الوحيدة التي يجب استخدامها لأبعاد layout و padding و margin وعرض/ارتفاع view.
إذا قمت بتعيين عرض زر إلى 160 px، على شاشة mdpi سيكون عرضه 1 بوصة، ولكن على شاشة xxxhdpi (640 dpi) — 0.25 بوصة فقط. dp يحل هذه المشكلة: 160 dp على أي شاشة سيساوي 1 بوصة. يقوم Android تلقائيًا بتحويل dp إلى px عبر DisplayMetrics.density أثناء العرض. وفقًا لـ Android Developer Blog (2025)، قبل تقديم dp (Android 1.0)، كان المطورون يحسبون إزاحات px يدويًا، مما أدى إلى أخطاء مستمرة عند النقل.
dp و px و sp هي ثلاث وحدات قياس في Android، لكل منها غرضها الخاص. px هو بكسل شاشة فيزيائي يعتمد على الكثافة. dp هو بكسل مستقل عن الكثافة لأبعاد العناصر. sp هو بكسل مستقل عن المقياس للنص يأخذ في الاعتبار أيضًا إعدادات حجم خط النظام. وفقًا لـ Material Design (2025)، الفرق بين dp و sp هو نقطة وصول رئيسية: المستخدمون ضعاف البصر يزيدون حجم الخط، وقيم sp تتكيف تلقائيًا، بينما dp لا يفعل ذلك.
| الوحدة | الاسم الكامل | تراعي الكثافة | تراعي إعدادات الخط | الاستخدام |
|---|---|---|---|---|
| px | بكسل | لا | لا | غير موصى به |
| dp | بكسل مستقل عن الكثافة | نعم | لا | التخطيط، الحواشي، الهوامش |
| sp | بكسل مستقل عن المقياس | نعم | نعم | حجم النص |
معادلة تحويل dp إلى px: px = dp × (dpi / 160). للتحويل العكسي: dp = px / (dpi / 160). density هي نسبة dpi / 160، التي يحسبها Android بناءً على DisplayMetrics. على mdpi density = 1.0، على hdpi = 1.5، على xhdpi = 2.0، على xxhdpi = 3.0، على xxxhdpi = 4.0. وبالتالي، 48 dp بالبكسل: على mdpi — 48 px، على xxhdpi — 144 px. وفقًا لـ Google I/O 2024، يمكن استخدام هذه المعادلة للتحويل التقريبي لـ pt (نقاط) iOS إلى dp — 1 pt ≈ 1 dp.
| المجموعة | الكثافة | قيمة dpi | 48 dp بالبكسل | 16 dp بالبكسل |
|---|---|---|---|---|
| mdpi | 1.0 | 160 | 48 | 16 |
| hdpi | 1.5 | 240 | 72 | 24 |
| xhdpi | 2.0 | 320 | 96 | 32 |
| xxhdpi | 3.0 | 480 | 144 | 48 |
| xxxhdpi | 4.0 | 640 | 192 | 64 |
dimens.xml هو ملف موارد Android في res/values/، مخصص لتخزين جميع الأبعاد بـ dp (و sp للنص). مركزية الأبعاد في dimens.xml تبسط الصيانة: تغيير قيمة واحدة في dimens.xml يحدث الحجم في جميع شاشات التطبيق. يمكنك إنشاء ملفات dimens.xml مؤهلة لكثافات مختلفة (values-hdpi, values-xhdpi). وفقًا لـ Android Jetpack Docs (2025)، توصي Google بتخزين الهوامش والحواشي وعروض العناصر (الثوابت) وأحجام الصورة الرمزية وارتفاع شريط الأدوات في dimens.xml.
<resources>
<dimen name="margin_small">8dp</dimen>
<dimen name="margin_medium">16dp</dimen>
<dimen name="margin_large">24dp</dimen>
<dimen name="avatar_size">48dp</dimen>
<dimen name="toolbar_height">56dp</dimen>
<dimen name="text_size_body">14sp</dimen>
<dimen name="icon_size_small">24dp</dimen>
</resources>
في هذا الملف، كل dimen له اسم وقيمة. الاستخدام في ترميز XML: @dimen/avatar_size. وفقًا لـ Material Design Guidelines (2025)، الخطوة الأساسية للشبكة في Android هي 8 dp (شبكة 8 نقاط). يجب أن تكون جميع الهوامش وأحجام العناصر والمسافات من مضاعفات 8 dp: 8، 16، 24، 32، 48، 56، 64، 72 dp. للنص، الخطوة هي 4 sp.
في ترميز XML، يستخدم dp مباشرة: android:layout_width="48dp". في الكود البرمجي (Kotlin/Java)، تحتاج إلى تحويل dp إلى px باستخدام TypedResource أو دوال الامتداد. TypedResource يوفر طرقًا جاهزة للعمل مع dp في وقت التشغيل: getDimensionPixelSize() يُرجع قيمة px صحيحة. في Jetpack Compose، dp هي وحدة القياس القياسية في المعدّلات وحاويات التخطيط.
// تحويل dp إلى px برمجيًا
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// الاستخدام في Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp كوحدة مدمجة
Modifier
.padding(16.dp)
.size(48.dp)
في هذا المثال، dpToPx() هي دالة امتداد لـ Context، تحول dp إلى px باستخدام displayMetrics.density. في Jetpack Compose، dp مدمج في نظام الأنواع ولا يتطلب تحويلًا يدويًا — يقوم المترجم تلقائيًا بترجمة dp إلى px في مرحلة العرض.
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:padding="@dimen/margin_medium"
android:textSize="@dimen/text_size_body"
android:text="@string/button_label"
android:layout_marginTop="16dp"
/>
في XML، dp يُحدد كلاحقة للرقم — margin_top="16dp". للنص يُستخدم sp — textSize="@dimen/text_size_body". المرجع @dimen يسمح بإدارة مركزية للقيم. استخدام match_parent للعرض و 48dp للارتفاع هو نمط قياسي لـ Material Design للأزرار.
وفقًا لتحليل تطبيقات Android من Google Play Console (2025)، الأخطاء الخمسة الأكثر شيوعًا هي: استخدام px بدلاً من dp في ترميز XML، عدم وجود dimens.xml (قيم مكتوبة مباشرة)، تحويل غير صحيح من dp إلى px في الكود (باستخدام قسمة الأعداد الصحيحة)، تجاهل sp للنص، وعدم مراعاة إعدادات حجم خط النظام عبر sp. قسمة الأعداد الصحيحة هي أخطر خطأ: في Kotlin val px = dp * density — إذا كان dp و density من نوع Int، ستكون النتيجة أيضًا Int، وتفقد الدقة.
الأسئلة الشائعة
dp في Android و pt (نقاط) في iOS وحدتا قياس متكافئتان. 1 dp في Android يساوي تقريبًا 1 pt في iOS. يصف كلا المفهومين نقاطًا مستقلة عن الكثافة: على الأجهزة القديمة منخفضة الكثافة 1 dp/pt = 1 px، على الحديثة — 2-4 px. الفرق في القيمة الأساسية: Android يستخدم 160 dpi ككثافة أساسية، iOS يستخدم 163 dpi، مما يعطي هامش خطأ أقل من 2%.
في Jetpack Compose لا حاجة للتحويل — dp مدمج في نظام الأنواع. جميع المعدّلات والتخطيطات تقبل Dp وليس px. إذا كنت بحاجة إلى الحصول على px من dp، استخدم density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity يوفر عامل التحويل الذي يأخذ في الاعتبار كثافة شاشة الجهاز.
dp هو مصطلح Android. في iOS، المعادل هو pt (نقاط). يعمل Swift تلقائيًا مع النقاط المستقلة عن كثافة الشاشة. في UIKit و SwiftUI، جميع الأبعاد تُحدد بالنقاط، ويقوم النظام بتحويلها إلى px باستخدام عامل مقياس الشاشة (UIScreen.main.scale). نفس المبدأ، اسم مختلف.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.