Nous expliquons les bases du dp (pixel indépendant de la densité) — une unité de mesure sous Android qui garantit la même taille physique des éléments d'interface sur des écrans avec différentes densités de pixels. Un dp correspond toujours à 1/160 de pouce à l'écran, que l'appareil ait une résolution haute ou basse. Selon Google Material Design (2025), toutes les dimensions dans les applications Android doivent être spécifiées en dp, pas en px, sinon l'interface aura un aspect différent sur différents appareils.
Points clés
dp (pixel indépendant de la densité) est une unité de mesure virtuelle sous Android, introduite pour unifier les tailles des éléments d'interface sur les appareils avec différentes densités de pixels. Un dp équivaut approximativement à un pixel physique sur un écran avec une densité de 160 dpi (mdpi). Sur un écran avec une densité de 320 dpi (xhdpi), 1 dp équivaut à 2 pixels physiques. Ainsi, la taille physique d'un élément à l'écran reste la même — environ 1/160 de pouce. Selon Android Developers (2025), dp est la seule unité de mesure qui devrait être utilisée pour les dimensions de layout, padding, margin et la largeur/hauteur des vues.
Si vous définissez la largeur d'un bouton à 160 px, sur un écran mdpi il fera 1 pouce de large, mais sur un écran xxxhdpi (640 dpi) — seulement 0,25 pouce. dp résout ce problème : 160 dp sur n'importe quel écran équivaudront à 1 pouce. Android convertit automatiquement dp en px via DisplayMetrics.density lors du rendu. Selon Android Developer Blog (2025), avant l'introduction de dp (Android 1.0), les développeurs calculaient manuellement les décalages en px, ce qui entraînait des bogues constants lors du portage.
dp, px et sp sont trois unités de mesure sous Android, chacune avec son propre objectif. px est un pixel physique d'écran qui dépend de la densité. dp est un pixel indépendant de la densité pour les dimensions des éléments. sp est un pixel indépendant de l'échelle pour le texte qui prend également en compte les paramètres de taille de police du système. Selon Material Design (2025), la différence entre dp et sp est un point clé d'accessibilité : les utilisateurs malvoyants augmentent la taille de la police, et les valeurs sp s'ajustent automatiquement, contrairement à dp.
| Unité | Nom complet | Tient compte de la densité | Tient compte des paramètres de police | Utilisation |
|---|---|---|---|---|
| px | Pixel | Non | Non | Non recommandé |
| dp | Pixel indépendant de la densité | Oui | Non | Layout, padding, margins |
| sp | Pixel indépendant de l'échelle | Oui | Oui | Taille du texte |
La formule de conversion de dp en px : px = dp × (dpi / 160). Pour la conversion inverse : dp = px / (dpi / 160). density est le rapport dpi / 160, qu'Android calcule à partir de DisplayMetrics. Sur mdpi density = 1,0, sur hdpi = 1,5, sur xhdpi = 2,0, sur xxhdpi = 3,0, sur xxxhdpi = 4,0. Ainsi, 48 dp en pixels : sur mdpi — 48 px, sur xxhdpi — 144 px. Selon Google I/O 2024, cette formule peut être utilisée pour la conversion approximative des pt (points) iOS en dp — 1 pt ≈ 1 dp.
| Bucket | Densité | Valeur dpi | 48 dp en px | 16 dp en 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 est un fichier de ressources Android dans res/values/, destiné à stocker toutes les dimensions en dp (et sp pour le texte). Centraliser les dimensions dans dimens.xml simplifie la maintenance : modifier une valeur dans dimens.xml met à jour la taille sur tous les écrans de l'application. Vous pouvez créer des fichiers dimens.xml qualifiés pour différentes densités (values-hdpi, values-xhdpi). Selon Android Jetpack Docs (2025), Google recommande de stocker les marges, le padding, les largeurs d'éléments (constantes), les tailles d'avatar et la hauteur de la barre d'outils dans 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>
Dans ce fichier, chaque dimen a un nom et une valeur. Utilisation dans le balisage XML : @dimen/avatar_size. Selon Material Design Guidelines (2025), le pas de grille de base sous Android est de 8 dp (grille à 8 points). Toutes les marges, tailles d'éléments et distances doivent être des multiples de 8 dp : 8, 16, 24, 32, 48, 56, 64, 72 dp. Pour le texte, le pas est de 4 sp.
Dans le balisage XML, dp est utilisé directement : android:layout_width="48dp". Dans le code programmatique (Kotlin/Java), vous devez convertir dp en px à l'aide de TypedResource ou de fonctions d'extension. TypedResource fournit des méthodes prêtes à l'emploi pour travailler avec dp au moment de l'exécution : getDimensionPixelSize() retourne une valeur entière en px. Dans Jetpack Compose, dp est l'unité de mesure standard dans les modificateurs et les conteneurs de mise en page.
// Conversion programmatique de dp en px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Utilisation dans Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose : dp comme unité intégrée
Modifier
.padding(16.dp)
.size(48.dp)
Dans cet exemple, dpToPx() est une fonction d'extension pour Context, convertissant dp en px à l'aide de displayMetrics.density. Dans Jetpack Compose, dp est intégré au système de types et ne nécessite pas de conversion manuelle — le compilateur traduit automatiquement dp en px lors de l'étape de rendu.
<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"
/>
En XML, dp est spécifié comme suffixe du nombre — margin_top="16dp". Pour le texte, sp est utilisé — textSize="@dimen/text_size_body". La référence @dimen permet une gestion centralisée des valeurs. L'utilisation de match_parent pour la largeur et de 48dp pour la hauteur est un modèle Material Design standard pour les boutons.
Selon une analyse des applications Android de Google Play Console (2025), les cinq erreurs les plus courantes sont : l'utilisation de px au lieu de dp dans le balisage XML, l'absence de dimens.xml (valeurs écrites en ligne), la conversion incorrecte de dp en px dans le code (utilisation de la division entière), l'ignorance de sp pour le texte et la non-prise en compte des paramètres de taille de police système via sp. La division entière est l'erreur la plus dangereuse : en Kotlin val px = dp * density — si dp et density sont Int, le résultat sera également Int, et la précision est perdue.
Foire aux questions
dp sous Android et pt (points) sous iOS sont des unités de mesure équivalentes. 1 dp sous Android équivaut approximativement à 1 pt sous iOS. Les deux concepts décrivent des points indépendants de la densité : sur les anciens appareils à faible densité 1 dp/pt = 1 px, sur les modernes — 2-4 px. La différence réside dans la valeur de base : Android utilise 160 dpi comme densité de base, iOS utilise 163 dpi, ce qui donne une marge d'erreur inférieure à 2 %.
Dans Jetpack Compose, aucune conversion n'est nécessaire — dp est intégré au système de types. Tous les modificateurs et mises en page acceptent Dp, pas px. Si vous avez besoin d'obtenir px à partir de dp, utilisez density : val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity fournit le facteur de conversion qui tient compte de la densité d'écran de l'appareil.
dp est un terme Android. Sous iOS, l'équivalent est pt (points). Swift fonctionne automatiquement avec des points indépendants de la densité d'écran. Dans UIKit et SwiftUI, toutes les dimensions sont spécifiées en points, et le système les convertit en px à l'aide du facteur d'échelle de l'écran (UIScreen.main.scale). Même principe, nom différent.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi