Vi förklarar grunderna för dp (density-independent pixel) — måttenheten i Android som säkerställer samma fysiska storlek på UI-element på skärmar med olika pixeldensitet. En dp motsvarar alltid 1/160 tum på skärmen, oavsett om enheten har hög eller låg upplösning. Enligt Google Material Design (2025) måste alla mått i Android-appar anges i dp, inte i px, annars kommer gränssnittet att se olika ut på olika enheter.
Huvudpunkter
dp (density-independent pixel) — är en virtuell måttenhet i Android, införd för att enhetliggöra storleken på UI-element på enheter med olika pixeldensitet. En dp är ungefär lika med en fysisk pixel på en skärm med densiteten 160 dpi (mdpi). På en skärm med densiteten 320 dpi (xhdpi) kommer 1 dp att vara lika med 2 fysiska pixlar. På så sätt förblir elementets fysiska storlek på skärmen densamma — cirka 1/160 tum. Enligt Android Developers (2025) är dp den enda måttenhet som ska användas för layout, padding, margin och bredd/höjd på vyer.
Om du ställer in bredden på en knapp till 160 px, på en mdpi-skärm kommer den att vara 1 tum bred, och på en xxxhdpi-skärm (640 dpi) — endast 0,25 tum. dp löser detta problem: 160 dp på vilken skärm som helst kommer att vara lika med 1 tum. Android konverterar automatiskt dp till px via DisplayMetrics.density vid rendering. Enligt Android Developer Blog (2025) använde utvecklare före införandet av dp (Android 1.0) px manuellt, vilket ledde till ständiga buggar vid portning.
dp, px och sp — tre måttenheter i Android, var och en med sitt syfte. px — skärmens fysiska pixel, som beror på densiteten. dp — densitetsoberoende pixel för elementstorlekar. sp — scale-independent pixel för text, som även tar hänsyn till systeminställningar för teckenstorlek. Enligt Material Design (2025) är skillnaden mellan dp och sp en viktig aspekt av tillgänglighet: användare med dålig syn förstorar teckensnittet och sp-värden anpassas automatiskt, medan dp — inte.
| Enhet | Fullständigt namn | Tar hänsyn till densitet | Tar hänsyn till teckeninställningar | Användning |
|---|---|---|---|---|
| px | Pixel | Nej | Nej | Rekommenderas inte |
| dp | Density-independent Pixel | Ja | Nej | Layout, padding, marginaler |
| sp | Scale-independent Pixel | Ja | Ja | Textstorlek |
Konverteringsformel dp till px: px = dp × (dpi / 160). För omvänd konvertering: dp = px / (dpi / 160). density — förhållandet dpi / 160, som Android beräknar baserat på DisplayMetrics. På mdpi density = 1.0, på hdpi = 1.5, på xhdpi = 2.0, på xxhdpi = 3.0, på xxxhdpi = 4.0. Alltså 48 dp i pixlar: på mdpi — 48 px, på xxhdpi — 144 px. Enligt Google I/O 2024 kan denna formel användas för ungefärlig konvertering av iOS pt (points) till dp — 1 pt ≈ 1 dp.
| Bucket | Density | dpi-värde | 48 dp i px | 16 dp i 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-resursfil i res/values/, avsedd för lagring av alla mått i dp (och sp för text). Centralisering av mått i dimens.xml förenklar underhållet: en ändring av ett värde i dimens.xml uppdaterar storleken på alla skärmar i appen. Kvalificerade dimens.xml-filer kan skapas för olika densiteter (values-hdpi, values-xhdpi). Enligt Android Jetpack Docs (2025) rekommenderar Google att lagra i dimens.xml mellanrum (margin, padding), elementbredder (konstanter), avatarstorlekar och verktygsfältshöjd.
<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>
I denna fil har varje dimen ett namn och ett värde. Användning i XML-filer: @dimen/avatar_size. Enligt Material Design Guidelines (2025) är grundsteget för rutnätet i Android 8 dp (8-point grid). Alla mellanrum, elementstorlekar och avstånd bör vara multiplar av 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. För text är steget 4 sp.
I XML-filer används dp direkt: android:layout_width="48dp". I programkod (Kotlin/Java) måste dp konverteras till px med hjälp av TypedResource eller tilläggsfunktioner. TypedResource tillhandahåller färdiga metoder för att arbeta med dp vid körning: getDimensionPixelSize() returnerar ett heltal px. I Jetpack Compose är dp standardmåttenheten i modifierare och layout-containrar.
// Programmatisk konvertering av dp till px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Användning i Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp som inbyggd enhet
Modifier
.padding(16.dp)
.size(48.dp)
I detta exempel är dpToPx() — en tilläggsfunktion för Context, som konverterar dp till px med hjälp av displayMetrics.density. I Jetpack Compose är dp inbyggt i typsystemet och kräver ingen manuell konvertering — kompilatorn översätter automatiskt dp till px i renderingsfasen.
<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"
/>
I XML läggs dp till som suffix till talet — margin_top="16dp". För text används sp — textSize="@dimen/text_size_body". Referensen @dimen möjliggör centraliserad hantering av värden. Användning av match_parent för bredd och 48dp för höjd är ett standardmönster i Material Design för knappar.
Enligt analys av Android-appar från Google Play Console (2025) är de fem vanligaste misstagen: användning av px istället för dp i XML-filer, avsaknad av dimens.xml (värden inline skrivna), felaktig konvertering av dp till px i kod (användning av heltalsdivision), ignorering av sp för text och att inte ta hänsyn till systeminställningar för teckenstorlek via sp. Heltalsdivision är det farligaste misstaget: i Kotlin val px = dp * density — om dp och density är Int, blir resultatet också Int och precisionen går förlorad.
Vanliga frågor
dp i Android och pt (points) i iOS — är ekvivalenta måttenheter. 1 dp i Android är ungefär lika med 1 pt i iOS. Båda begreppen beskriver densitetsoberoende punkter: på gamla enheter med låg densitet är 1 dp/pt = 1 px, på moderna — 2-4 px. Skillnaden i basvärde: Android använder 160 dpi som basdensitet, iOS — 163 dpi, vilket ger ett fel på mindre än 2%.
I Jetpack Compose krävs ingen konvertering — dp är inbyggt i typsystemet. Alla modifierare och layouts accepterar Dp, inte px. Om du behöver få px från dp, använd density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity tillhandahåller konverteringsfaktorn som tar hänsyn till enhetens skärmdensitet.
dp — en Android-term. I iOS är motsvarigheten pt (points). Swift arbetar automatiskt med punkter som inte är beroende av skärmdensiteten. I UIKit och SwiftUI anges alla mått i punkter och systemet konverterar dem till px med hjälp av skärmens skalfaktor (UIScreen.main.scale). Principen är densamma, namnet är annorlunda.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också