مبانی dp (density-independent pixel) — واحد اندازهگیری در Android را توضیح میدهیم که اندازه فیزیکی یکسان عناصر UI را در صفحهنمایشهایی با تراکم پیکسلی متفاوت تضمین میکند. یک dp همیشه معادل 1/160 اینچ روی صفحهنمایش است، صرفنظر از اینکه دستگاه وضوح بالا یا پایینی دارد. بر اساس Google Material Design (2025)، تمام اندازهها در برنامههای Android باید با dp مشخص شوند، نه px، در غیر این صورت رابط کاربری در دستگاههای مختلف متفاوت به نظر میرسد.
نکات اصلی
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ها استفاده شود.
اگر عرض دکمه را 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 — سه واحد اندازهگیری در Android، هر یک با هدف خود. px — پیکسل فیزیکی صفحهنمایش که به تراکم وابسته است. dp — پیکسل مستقل از تراکم برای اندازه عناصر. sp — scale-independent pixel برای متن که تنظیمات سیستمی اندازه قلم را نیز در نظر میگیرد. بر اساس Material Design (2025)، تفاوت بین dp و sp یک جنبه کلیدی دسترسیپذیری است: کاربران با بینایی ضعیف قلم را بزرگ میکنند و مقادیر sp به طور خودکار تنظیم میشوند، در حالی که dp — نه.
| واحد | نام کامل | تراکم را در نظر میگیرد | تنظیمات قلم را در نظر میگیرد | کاربرد |
|---|---|---|---|---|
| px | Pixel | خیر | خیر | توصیه نمیشود |
| dp | Density-independent Pixel | بله | خیر | Layout، padding، حاشیهها |
| sp | Scale-independent Pixel | بله | بله | اندازه متن |
فرمول تبدیل 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.
| Bucket | Density | مقدار dpi | 48 dp در px | 16 dp در px |
|---|---|---|---|---|
| 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 فاصلهها (margin, padding)، عرض عناصر (ثابتها)، اندازه آواتارها و ارتفاع نوار ابزار ذخیره شود.
<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 است.
در فایلهای XML از dp مستقیماً استفاده میشود: android:layout_width="48dp". در کد برنامه (Kotlin/Java) باید dp را با استفاده از TypedResource یا توابع توسعهدهنده به px تبدیل کرد. TypedResource روشهای آماده برای کار با dp در زمان اجرا ارائه میدهد: getDimensionPixelSize() عدد صحیح px را برمیگرداند. در Jetpack Compose dp واحد اندازهگیری استاندارد در اصلاحکنندهها و کانتینرهای layout است.
// تبدیل برنامهنویسی 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 تبدیل میکند.
<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 (مقادیر به صورت inline نوشته شدهاند)، تبدیل نادرست dp به px در کد (استفاده از تقسیم عدد صحیح)، نادیده گرفتن sp برای متن و عدم توجه به تنظیمات سیستمی اندازه قلم از طریق sp. تقسیم عدد صحیح خطرناکترین خطا است: در Kotlin val px = dp * density — اگر dp و density از نوع Int باشند، نتیجه نیز Int خواهد بود و دقت از بین میرود.
سوالات متداول
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٪ ایجاد میکند.
در Jetpack Compose تبدیل لازم نیست — dp در سیستم نوعها تعبیه شده است. همه اصلاحکنندهها و layoutها Dp را میپذیرند، نه px را. اگر نیاز به دریافت px از dp دارید، از density استفاده کنید: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity ضریب تبدیل را با در نظر گرفتن تراکم صفحهنمایش دستگاه ارائه میدهد.
dp — اصطلاح Android است. در iOS معادل آن pt (points) است. Swift به طور خودکار با نقاطی کار میکند که به تراکم صفحهنمایش وابسته نیستند. در UIKit و SwiftUI همه اندازهها بر حسب نقاط مشخص میشوند و سیستم آنها را با استفاده از scale factor صفحه (UIScreen.main.scale) به px تبدیل میکند. اصل یکسان است، نام متفاوت است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید