dp — مبانی، پیکسل‌های مستقل از چگالی در Android

نویسنده: IT Sectr منتشر شده: 2026-02-25 زمان مطالعه: 7 دقیقه

مبانی dp (density-independent pixel) — واحد اندازه‌گیری در Android را توضیح می‌دهیم که اندازه فیزیکی یکسان عناصر UI را در صفحه‌نمایش‌هایی با تراکم پیکسلی متفاوت تضمین می‌کند. یک dp همیشه معادل 1/160 اینچ روی صفحه‌نمایش است، صرف‌نظر از اینکه دستگاه وضوح بالا یا پایینی دارد. بر اساس Google Material Design (2025)، تمام اندازه‌ها در برنامه‌های Android باید با dp مشخص شوند، نه px، در غیر این صورت رابط کاربری در دستگاه‌های مختلف متفاوت به نظر می‌رسد.

نکات اصلی

  • dp (density-independent pixel) — واحد اندازه‌گیری انتزاعی در 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 (density-independent pixel) — یک واحد اندازه‌گیری مجازی در Android است که برای یکسان‌سازی اندازه عناصر UI در دستگاه‌هایی با تراکم پیکسلی متفاوت معرفی شده است. یک 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 را از طریق DisplayMetrics.density هنگام رندر به px تبدیل می‌کند. بر اساس Android Developer Blog (2025)، قبل از معرفی dp (Android 1.0)، توسعه‌دهندگان به صورت دستی از px استفاده می‌کردند که منجر به اشکالات مداوم در هنگام انتقال برنامه می‌شد.

dp، px و sp: تفاوت در چیست

dp، px و sp — سه واحد اندازه‌گیری در Android، هر یک با هدف خود. px — پیکسل فیزیکی صفحه‌نمایش که به تراکم وابسته است. dp — پیکسل مستقل از تراکم برای اندازه عناصر. sp — scale-independent pixel برای متن که تنظیمات سیستمی اندازه قلم را نیز در نظر می‌گیرد. بر اساس Material Design (2025)، تفاوت بین dp و sp یک جنبه کلیدی دسترسی‌پذیری است: کاربران با بینایی ضعیف قلم را بزرگ می‌کنند و مقادیر sp به طور خودکار تنظیم می‌شوند، در حالی که dp — نه.

واحدنام کاملتراکم را در نظر می‌گیردتنظیمات قلم را در نظر می‌گیردکاربرد
pxPixelخیرخیرتوصیه نمی‌شود
dpDensity-independent PixelبلهخیرLayout، padding، حاشیه‌ها
spScale-independent Pixelبلهبلهاندازه متن

فرمول تبدیل 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 (points) iOS به dp استفاده کرد — 1 pt ≈ 1 dp.

BucketDensityمقدار dpi48 dp در px16 dp در px
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 فاصله‌ها (margin, padding)، عرض عناصر (ثابت‌ها)، اندازه آواتارها و ارتفاع نوار ابزار ذخیره شود.

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-point grid). همه فاصله‌ها، اندازه عناصر و فواصل باید مضرب 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 را با استفاده از TypedResource یا توابع توسعه‌دهنده به px تبدیل کرد. TypedResource روش‌های آماده برای کار با dp در زمان اجرا ارائه می‌دهد: getDimensionPixelSize() عدد صحیح px را برمی‌گرداند. در Jetpack Compose dp واحد اندازه‌گیری استاندارد در اصلاح‌کننده‌ها و کانتینرهای layout است.

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 را با استفاده از displayMetrics.density به px تبدیل می‌کند. در 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 (مقادیر به صورت inline نوشته شده‌اند)، تبدیل نادرست dp به px در کد (استفاده از تقسیم عدد صحیح)، نادیده گرفتن sp برای متن و عدم توجه به تنظیمات سیستمی اندازه قلم از طریق sp. تقسیم عدد صحیح خطرناک‌ترین خطا است: در Kotlin val px = dp * density — اگر dp و density از نوع Int باشند، نتیجه نیز Int خواهد بود و دقت از بین می‌رود.

  • px به جای dp — برنامه در دستگاه‌هایی با تراکم متفاوت ظاهر متفاوتی دارد. رفع: جایگزینی px با dp در XML.
  • مقادیر Inline — اندازه‌ها مستقیماً در فایل‌های layout نوشته شده‌اند. تکرار مقادیر نگهداری و به‌روزرسانی را دشوار می‌کند.
  • sp برای متن — استفاده از dp برای اندازه قلم تنظیمات کاربر را نادیده می‌گیرد و دسترسی‌پذیری را نقض می‌کند.
  • تقسیم عدد صحیح — در Kotlin تقسیم Int بر Int نتیجه Int می‌دهد و بخش اعشاری از بین می‌رود. همیشه از Float استفاده کنید.

سوالات متداول

تفاوت dp با pt در iOS چیست؟

dp در Android و pt (points) در 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 در سیستم نوع‌ها تعبیه شده است. همه اصلاح‌کننده‌ها و layoutها Dp را می‌پذیرند، نه px را. اگر نیاز به دریافت px از dp دارید، از density استفاده کنید: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity ضریب تبدیل را با در نظر گرفتن تراکم صفحه‌نمایش دستگاه ارائه می‌دهد.

آیا باید از dp در iOS استفاده کرد؟

dp — اصطلاح Android است. در iOS معادل آن pt (points) است. Swift به طور خودکار با نقاطی کار می‌کند که به تراکم صفحه‌نمایش وابسته نیستند. در UIKit و SwiftUI همه اندازه‌ها بر حسب نقاط مشخص می‌شوند و سیستم آن‌ها را با استفاده از scale factor صفحه (UIScreen.main.scale) به px تبدیل می‌کند. اصل یکسان است، نام متفاوت است.

خلاصه

  • dp — Density-independent Pixel، واحد انتزاعی برای اندازه‌های UI در Android، معادل 1/160 اینچ.
  • فرمول: px = dp × (dpi / 160). در mdpi 1 dp = 1 px، در xxhdpi 1 dp = 3 px.
  • همه اندازه‌ها در فایل‌های XML باید با dp مشخص شوند، اندازه متن — با sp.
  • dimens.xml — ذخیره‌سازی متمرکز اندازه‌ها. یک تغییر کل رابط کاربری را به‌روز می‌کند.
  • 8-point grid: همه اندازه‌ها مضرب 8 dp هستند، فاصله‌های متن — 4 sp.
  • در کد برنامه از TypedResource یا توابع توسعه‌دهنده برای تبدیل dp به px استفاده کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید