dp — الأساسيات، البكسل المستقل عن الكثافة في Android

المؤلف: IT Sectr نُشر: 2026-02-25 وقت القراءة: 7 دق

نشرح أساسيات dp (بكسل مستقل عن الكثافة) — وحدة قياس في Android تضمن نفس الحجم الفيزيائي لعناصر واجهة المستخدم على الشاشات بكثافات بكسلات مختلفة. واحد dp يساوي دائمًا 1/160 بوصة على الشاشة، بغض النظر عما إذا كان الجهاز ذو دقة عالية أو منخفضة. وفقًا لـ Google Material Design (2025)، يجب تحديد جميع الأبعاد في تطبيقات Android بـ dp وليس px، وإلا ستبدو الواجهة مختلفة على الأجهزة المختلفة.

النقاط الرئيسية

  • dp (بكسل مستقل عن الكثافة) — وحدة قياس مجردة في Android، تساوي 1/160 بوصة على الشاشة.
  • معادلة التحويل: px = dp × (dpi / 160). على شاشات mdpi 1 dp = 1 px، على xxhdpi 1 dp = 3 px.
  • جميع الأبعاد في تخطيطات XML (layout_width, padding, margin) تُحدد بـ dp.
  • dimens.xml — ملف موارد Android للتخزين المركزي لقيم dp.
  • وفقًا لـ Google Android Performance Guide (2025)، استخدام dp بدلاً من px يزيل 90% من مشاكل تكييف الواجهة على الشاشات المختلفة.

ما هو dp في Android؟

dp (بكسل مستقل عن الكثافة) هو وحدة قياس افتراضية في Android، تم تقديمها لتوحيد أحجام عناصر واجهة المستخدم على الأجهزة بكثافات بكسلات مختلفة. واحد dp يساوي تقريبًا بكسلًا فيزيائيًا واحدًا على شاشة بكثافة 160 dpi (mdpi). على شاشة بكثافة 320 dpi (xhdpi)، 1 dp يساوي 2 بكسل فيزيائيين. وبالتالي، يظل الحجم الفيزيائي للعنصر على الشاشة كما هو — حوالي 1/160 بوصة. وفقًا لـ Android Developers (2025)، dp هي وحدة القياس الوحيدة التي يجب استخدامها لأبعاد layout و padding و margin وعرض/ارتفاع view.

لماذا لا يجب استخدام px

إذا قمت بتعيين عرض زر إلى 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: ما الفرق

dp و px و sp هي ثلاث وحدات قياس في Android، لكل منها غرضها الخاص. px هو بكسل شاشة فيزيائي يعتمد على الكثافة. dp هو بكسل مستقل عن الكثافة لأبعاد العناصر. sp هو بكسل مستقل عن المقياس للنص يأخذ في الاعتبار أيضًا إعدادات حجم خط النظام. وفقًا لـ Material Design (2025)، الفرق بين dp و sp هو نقطة وصول رئيسية: المستخدمون ضعاف البصر يزيدون حجم الخط، وقيم sp تتكيف تلقائيًا، بينما dp لا يفعل ذلك.

الوحدةالاسم الكاملتراعي الكثافةتراعي إعدادات الخطالاستخدام
pxبكسللالاغير موصى به
dpبكسل مستقل عن الكثافةنعملاالتخطيط، الحواشي، الهوامش
spبكسل مستقل عن المقياسنعمنعمحجم النص

معادلة تحويل dp إلى px والعكس

معادلة تحويل 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.

المجموعةالكثافةقيمة dpi48 dp بالبكسل16 dp بالبكسل
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: إدارة مركزية للأبعاد

dimens.xml هو ملف موارد Android في res/values/، مخصص لتخزين جميع الأبعاد بـ dp (و sp للنص). مركزية الأبعاد في dimens.xml تبسط الصيانة: تغيير قيمة واحدة في dimens.xml يحدث الحجم في جميع شاشات التطبيق. يمكنك إنشاء ملفات dimens.xml مؤهلة لكثافات مختلفة (values-hdpi, values-xhdpi). وفقًا لـ Android Jetpack Docs (2025)، توصي Google بتخزين الهوامش والحواشي وعروض العناصر (الثوابت) وأحجام الصورة الرمزية وارتفاع شريط الأدوات في dimens.xml.

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.

الاستخدام البرمجي لـ dp في Kotlin و XML

في ترميز XML، يستخدم dp مباشرة: android:layout_width="48dp". في الكود البرمجي (Kotlin/Java)، تحتاج إلى تحويل dp إلى px باستخدام TypedResource أو دوال الامتداد. TypedResource يوفر طرقًا جاهزة للعمل مع dp في وقت التشغيل: getDimensionPixelSize() يُرجع قيمة px صحيحة. في Jetpack Compose، dp هي وحدة القياس القياسية في المعدّلات وحاويات التخطيط.

Kotlin
// تحويل 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 في مرحلة العرض.

ترميز XML مع dp

XML

<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 للأزرار.

الأخطاء الشائعة عند استخدام dp

وفقًا لتحليل تطبيقات Android من Google Play Console (2025)، الأخطاء الخمسة الأكثر شيوعًا هي: استخدام px بدلاً من dp في ترميز XML، عدم وجود dimens.xml (قيم مكتوبة مباشرة)، تحويل غير صحيح من dp إلى px في الكود (باستخدام قسمة الأعداد الصحيحة)، تجاهل sp للنص، وعدم مراعاة إعدادات حجم خط النظام عبر sp. قسمة الأعداد الصحيحة هي أخطر خطأ: في Kotlin val px = dp * density — إذا كان dp و density من نوع Int، ستكون النتيجة أيضًا Int، وتفقد الدقة.

  • px بدلاً من dp — يبدو التطبيق مختلفًا على الأجهزة بكثافات مختلفة. يتم التصحيح باستبدال px بـ dp في XML.
  • قيم مباشرة — الأبعاد مكتوبة مباشرة في ملفات التخطيط. تكرار القيم يعقد الصيانة والتحديثات.
  • sp للنص — استخدام dp لحجم الخط يتجاهل إعدادات المستخدم، مما يكسر إمكانية الوصول.
  • قسمة الأعداد الصحيحة — في Kotlin، قسمة Int على Int تعطي Int، مما يفقد الجزء الكسري. استخدم دائمًا Float.

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

كيف يختلف dp عن pt في iOS؟

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%.

كيفية تحويل dp إلى px في Jetpack Compose؟

في Jetpack Compose لا حاجة للتحويل — dp مدمج في نظام الأنواع. جميع المعدّلات والتخطيطات تقبل Dp وليس px. إذا كنت بحاجة إلى الحصول على px من dp، استخدم density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity يوفر عامل التحويل الذي يأخذ في الاعتبار كثافة شاشة الجهاز.

هل أحتاج إلى استخدام dp في iOS؟

dp هو مصطلح Android. في iOS، المعادل هو pt (نقاط). يعمل Swift تلقائيًا مع النقاط المستقلة عن كثافة الشاشة. في UIKit و SwiftUI، جميع الأبعاد تُحدد بالنقاط، ويقوم النظام بتحويلها إلى px باستخدام عامل مقياس الشاشة (UIScreen.main.scale). نفس المبدأ، اسم مختلف.

الخلاصة

  • dp — بكسل مستقل عن الكثافة، وحدة مجردة لأبعاد واجهة المستخدم في Android، تساوي 1/160 بوصة.
  • المعادلة: px = dp × (dpi / 160). على mdpi 1 dp = 1 px، على xxhdpi 1 dp = 3 px.
  • جميع الأبعاد في ترميز XML يجب أن تُحدد بـ dp، حجم النص بـ sp.
  • dimens.xml — تخزين مركزي للأبعاد. تغيير واحد يحدث الواجهة بأكملها.
  • شبكة 8 نقاط: جميع الأبعاد مضاعفات 8 dp، تباعد النص — 4 sp.
  • في الكود البرمجي، استخدم TypedResource أو دوال الامتداد لتحويل dp إلى px.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

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

اقرأ أيضًا