dp — 基本、Androidにおける密度非依存ピクセル

著者: IT Sectr 公開日: 2026-02-25 読了時間: 7 分

dp(密度非依存ピクセル)の基本を説明します。これはAndroidの測定単位で、異なるピクセル密度の画面でもUI要素の物理的なサイズを同じに保ちます。1 dpは常に画面の1/160インチに相当し、デバイスの解像度が高いか低いかに関係ありません。Google Material Design(2025)によると、Androidアプリケーションのすべての寸法はpxではなくdpで指定する必要があります。そうしないと、インターフェースがデバイスによって異なって見えます。

重要なポイント

  • dp(密度非依存ピクセル)— 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 — dp値を集中管理するためのAndroidリソースファイル。
  • Google Android Performance Guide(2025)によると、pxの代わりにdpを使用すると、異なる画面でのインターフェース適応の問題の90%が解消されます。

Androidにおけるdpとは?

dp(密度非依存ピクセル)はAndroidの仮想測定単位で、異なるピクセル密度のデバイスでUI要素のサイズを統一するために導入されました。1 dpは、160 dpi(mdpi)の画面で1物理ピクセルにほぼ相当します。320 dpi(xhdpi)の画面では、1 dpは2物理ピクセルに相当します。これにより、画面上の要素の物理的なサイズは同じまま — 約1/160インチです。Android Developers(2025)によると、dpはレイアウト、パディング、マージン、ビューの幅/高さの寸法に使用すべき唯一の測定単位です。

pxを使用すべきでない理由

ボタンの幅を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:違いは何か

dp、px、spはAndroidの3つの測定単位で、それぞれに目的があります。pxは密度に依存する物理的な画面ピクセルです。dpは要素の寸法のための密度非依存ピクセルです。spはテキストのためのスケール非依存ピクセルで、システムのフォントサイズ設定も考慮します。Material Design(2025)によると、dpとspの違いは重要なアクセシビリティのポイントです。視力の弱いユーザーはフォントサイズを大きくし、sp値は自動的に調整されますが、dpは調整されません。

単位正式名称密度を考慮フォント設定を考慮用途
pxピクセルいいえいいえ推奨されません
dp密度非依存ピクセルはいいいえレイアウト、パディング、マージン
spスケール非依存ピクセルはいはいテキストサイズ

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によると、この式はiOSのpt(ポイント)からdpへのおおよその変換に使用できます — 1 pt ≈ 1 dp。

バケット密度dpi値48 dp(px)16 dp(px)
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml:集中寸法管理

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に保存することを推奨しています。

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です。

KotlinとXMLでのdpのプログラム的使用

XMLマークアップでは、dpを直接使用します:android:layout_width="48dp"。プログラムコード(Kotlin/Java)では、TypedResourceまたは拡張関数を使用してdpをpxに変換する必要があります。TypedResourceは実行時にdpを操作するための既製のメソッドを提供します。getDimensionPixelSize()は整数のpx値を返します。Jetpack Composeでは、dpはモディファイアとレイアウトコンテナの標準測定単位です。

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の拡張関数で、displayMetrics.densityを使用してdpをpxに変換します。Jetpack Composeでは、dpは型システムに組み込まれており、手動変換は不要です — コンパイラがレンダリング段階で自動的にdpをpxに変換します。

dpを使用したXMLマークアップ

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使用時の一般的な間違い

Google Play Console(2025)のAndroidアプリケーション分析によると、5つの最も一般的な間違いは次のとおりです:XMLマークアップでpxの代わりにdpを使用しない、dimens.xmlの欠如(値がインラインで記述されている)、コード内の誤ったdpからpxへの変換(整数除算の使用)、テキストのspを無視する、spによるシステムフォントサイズ設定を考慮しない。整数除算が最も危険な間違いです:Kotlinでval px = dp * density — dpとdensityがIntの場合、結果もIntになり、精度が失われます。

  • pxの代わりにdp — アプリケーションが異なる密度のデバイスで異なって見えます。XMLでpxをdpに置き換えて修正します。
  • インライン値 — 寸法がレイアウトファイルに直接記述されています。値の重複はメンテナンスと更新を複雑にします。
  • テキストのsp — フォントサイズにdpを使用するとユーザー設定が無視され、アクセシビリティが損なわれます。
  • 整数除算 — Kotlinでは、IntをIntで割るとIntになり、小数部分が失われます。常にFloatを使用してください。

よくある質問

dpはiOSのptとどう違うのですか?

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に変換するには?

Jetpack Composeでは変換は不要です — dpは型システムに組み込まれています。すべてのモディファイアとレイアウトはpxではなくDpを受け入れます。dpからpxを取得する必要がある場合は、densityを使用します:val px = with(LocalDensity.current){ 16.dp.toPx()}。LocalDensityはデバイスの画面密度を考慮した変換係数を提供します。

iOSでdpを使用する必要がありますか?

dpはAndroidの用語です。iOSでは、同等のものはpt(ポイント)です。Swiftは画面密度に依存しないポイントで自動的に動作します。UIKitとSwiftUIでは、すべての寸法はポイントで指定され、システムは画面のスケールファクター(UIScreen.main.scale)を使用してpxに変換します。同じ原理、異なる名前です。

まとめ

  • dp — 密度非依存ピクセル、AndroidのUI寸法のための抽象単位、1/160インチに相当。
  • 式:px = dp ×(dpi / 160)。mdpiでは1 dp = 1 px、xxhdpiでは1 dp = 3 px。
  • XMLマークアップのすべての寸法はdpで指定し、テキストサイズはspで指定します。
  • dimens.xml — 寸法の集中保存。1つの変更でインターフェース全体が更新されます。
  • 8ポイントグリッド:すべての寸法は8 dpの倍数、テキスト間隔は4 sp。
  • プログラムコードでは、TypedResourceまたは拡張関数を使用してdpをpxに変換します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください