dp(密度非依存ピクセル)の基本を説明します。これはAndroidの測定単位で、異なるピクセル密度の画面でもUI要素の物理的なサイズを同じに保ちます。1 dpは常に画面の1/160インチに相当し、デバイスの解像度が高いか低いかに関係ありません。Google Material Design(2025)によると、Androidアプリケーションのすべての寸法はpxではなくdpで指定する必要があります。そうしないと、インターフェースがデバイスによって異なって見えます。
重要なポイント
dp(密度非依存ピクセル)はAndroidの仮想測定単位で、異なるピクセル密度のデバイスでUI要素のサイズを統一するために導入されました。1 dpは、160 dpi(mdpi)の画面で1物理ピクセルにほぼ相当します。320 dpi(xhdpi)の画面では、1 dpは2物理ピクセルに相当します。これにより、画面上の要素の物理的なサイズは同じまま — 約1/160インチです。Android Developers(2025)によると、dpはレイアウト、パディング、マージン、ビューの幅/高さの寸法に使用すべき唯一の測定単位です。
ボタンの幅を160 pxに設定すると、mdpi画面では幅1インチになりますが、xxxhdpi画面(640 dpi)ではわずか0.25インチになります。dpはこの問題を解決します。どの画面でも160 dpは1インチになります。Androidはレンダリング時にDisplayMetrics.densityを介してdpをpxに自動変換します。Android Developer Blog(2025)によると、dp(Android 1.0)が導入される前は、開発者は手動でpxオフセットを計算しており、移植時に常にバグが発生していました。
dp、px、spはAndroidの3つの測定単位で、それぞれに目的があります。pxは密度に依存する物理的な画面ピクセルです。dpは要素の寸法のための密度非依存ピクセルです。spはテキストのためのスケール非依存ピクセルで、システムのフォントサイズ設定も考慮します。Material Design(2025)によると、dpとspの違いは重要なアクセシビリティのポイントです。視力の弱いユーザーはフォントサイズを大きくし、sp値は自動的に調整されますが、dpは調整されません。
| 単位 | 正式名称 | 密度を考慮 | フォント設定を考慮 | 用途 |
|---|---|---|---|---|
| px | ピクセル | いいえ | いいえ | 推奨されません |
| dp | 密度非依存ピクセル | はい | いいえ | レイアウト、パディング、マージン |
| sp | スケール非依存ピクセル | はい | はい | テキストサイズ |
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によると、この式はiOSのpt(ポイント)からdpへのおおよその変換に使用できます — 1 pt ≈ 1 dp。
| バケット | 密度 | 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はres/values/内のAndroidリソースファイルで、すべての寸法をdp(テキストはsp)で保存するためのものです。dimens.xmlに寸法を集中管理することで、メンテナンスが簡素化されます。dimens.xmlの値を1つ変更するだけで、アプリケーションのすべての画面でサイズが更新されます。異なる密度(values-hdpi、values-xhdpi)用に修飾されたdimens.xmlファイルを作成できます。Android Jetpack Docs(2025)によると、Googleはマージン、パディング、要素の幅(定数)、アバターサイズ、ツールバーの高さを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>
このファイルでは、各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です。
XMLマークアップでは、dpを直接使用します:android:layout_width="48dp"。プログラムコード(Kotlin/Java)では、TypedResourceまたは拡張関数を使用してdpをpxに変換する必要があります。TypedResourceは実行時にdpを操作するための既製のメソッドを提供します。getDimensionPixelSize()は整数のpx値を返します。Jetpack Composeでは、dpはモディファイアとレイアウトコンテナの標準測定単位です。
// プログラムによる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の拡張関数で、displayMetrics.densityを使用してdpを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パターンです。
Google Play Console(2025)のAndroidアプリケーション分析によると、5つの最も一般的な間違いは次のとおりです:XMLマークアップでpxの代わりにdpを使用しない、dimens.xmlの欠如(値がインラインで記述されている)、コード内の誤ったdpからpxへの変換(整数除算の使用)、テキストのspを無視する、spによるシステムフォントサイズ設定を考慮しない。整数除算が最も危険な間違いです:Kotlinでval px = dp * density — dpとdensityがIntの場合、結果もIntになり、精度が失われます。
よくある質問
AndroidのdpとiOSのpt(ポイント)は同等の測定単位です。Androidの1 dpはiOSの1 ptにほぼ相当します。どちらの概念も密度非依存ポイントを表します:古い低密度デバイスでは1 dp/pt = 1 px、現代のデバイスでは2〜4 pxです。違いは基準値にあります:Androidは基本密度として160 dpiを使用し、iOSは163 dpiを使用しており、誤差は2%未満です。
Jetpack Composeでは変換は不要です — dpは型システムに組み込まれています。すべてのモディファイアとレイアウトはpxではなくDpを受け入れます。dpからpxを取得する必要がある場合は、densityを使用します:val px = with(LocalDensity.current){ 16.dp.toPx()}。LocalDensityはデバイスの画面密度を考慮した変換係数を提供します。
dpはAndroidの用語です。iOSでは、同等のものはpt(ポイント)です。Swiftは画面密度に依存しないポイントで自動的に動作します。UIKitとSwiftUIでは、すべての寸法はポイントで指定され、システムは画面のスケールファクター(UIScreen.main.scale)を使用してpxに変換します。同じ原理、異なる名前です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。