px — 物理ピクセル、デバイス画面上の画像の最小要素。モバイル開発では、pxは画面解像度とピクセル密度(PPI)の基本単位として使用されますが、インターフェースレイアウトには実質的に使用されません — 代わりに論理ユニットpt、dp、spが使用されます。この記事では、pxが論理ユニットとどのように異なるか、解像度とPPIがどのように関連するか、そしてコードでpxを直接使用することがアンチパターンである理由を説明します。
重要なポイント
px(ピクセル、ピクチャエレメント) — ラスター画像またはディスプレイの最小アドレス可能要素。各ピクセルは、RGBモデル(赤、緑、青)でチャンネルあたり8〜10ビットの色深度で色情報を保存します。最新のモバイルデバイスのディスプレイには数百万のピクセルが含まれています:iPhone 15 Pro — 300万、iPad Pro 12.9" — 560万ピクセル。
ピクセルの物理サイズはディスプレイ密度(PPI)に依存します。326 PPI(iPhone 11)のデバイスでは、1ピクセルは約0.078 mmです。460 PPI(iPhone 15 Pro)のディスプレイでは — 0.055 mm。ピクセルの物理サイズが小さいほど、画像の鮮明度が高くなります。同時に、ピクセル密度はレンダリングパフォーマンスに直接影響します:ピクセルが多い = GPUへの負荷が大きい。
Appleによると、iPhone 15 Proのディスプレイ解像度は1179 × 2556 px、460 PPIです。比較すると、iPhone SE(第3世代) — 750 × 1334 px、326 PPI。総ピクセル数の差は約3倍で、ProモデルでのGPU要件の高さを説明しています。
画面解像度 — 水平および垂直方向の物理ピクセルの数。幅×高さの形式で記述され、例:1179 × 2556 px。解像度はディスプレイの基本特性であり、プログラムで変更することはできません — ハードウェアとマトリックスレベルで固定されています。
| デバイス | 解像度(px) | PPI | アスペクト比 |
|---|---|---|---|
| iPhone SE(第3世代) | 750 × 1334 | 326 | 16:9 |
| iPhone 14 | 1170 × 2532 | 460 | 19.5:9 |
| iPhone 15 Pro Max | 1290 × 2796 | 460 | 19.5:9 |
| Samsung Galaxy S24 Ultra | 1440 × 3120 | 505 | 19.5:9 |
| Google Pixel 8 Pro | 1344 × 2992 | 490 | 20:9 |
| iPad Pro 12.9" | 2048 × 2732 | 264 | 4:3 |
ピクセル単位の解像度を画面の論理サイズ(iOSのptやAndroidのdp)と混同しないでください。例えば、iPhone 14の論理サイズは390 × 844 ptですが、物理解像度は1170 × 2532 px — スケールファクターが3のため、正確に3倍大きくなっています。
PPI(1インチあたりのピクセル数) — ディスプレイの1インチあたりのピクセル数。計算式:PPI = √(幅² + 高さ²)/ 対角線。PPIが高いほど、個々のピクセルが小さくなり、画像が滑らかに見えます。Appleは、標準的な視聴距離でPPIが300を超えるディスプレイをRetinaディスプレイと見なしています。
デバイスカテゴリによって密度は異なります:Apple Watch — 326 PPI、iPhone — 326〜460 PPI、iPad — 264 PPI、MacBook Pro — 254〜264 PPI。AndroidデバイスはDensity Bucketsで密度を分類します:mdpi(160 dpi)、hdpi(240)、xhdpi(320)、xxhdpi(480)、xxxhdpi(640)。これらのバケットは、デバイスにどのリソース(画像、dimens)がロードされるかを決定します。
開発におけるPPIの影響:密度が高いほど、テクスチャや画像の保存により多くのメモリが必要になります。500 PPIのディスプレイの1ピクセルは、同じ論理要素サイズで320 PPIのディスプレイよりも2.5倍多くのGPUメモリを必要とします。特定の密度バケットに合わせたアセットの最適化は、Android開発の標準的なプラクティスです。
物理ピクセル(px)は論理ユニット(pt、dp、sp)とは異なり、ハードウェア解像度に結びついておりスケーリングされません。論理ユニットは逆に、開発者を特定のディスプレイから抽象化し、100 ptの単一の値が異なるデバイスで同じ物理サイズで表示されることを可能にします。
| ユニット | プラットフォーム | PPI依存 | スケール | 目的 |
|---|---|---|---|---|
| px | すべて | はい(物理ピクセル) | いいえ | 画像、バッファ、Metal |
| pt | iOS/macOS | いいえ(論理ポイント) | スケールファクター | レイアウト、UIKit、SwiftUI |
| dp | Android | いいえ(密度非依存) | 密度バケット | レイアウト、要素サイズ |
| sp | Android | いいえ(スケール非依存) | 密度 + フォントスケール | テキスト(textSize) |
変換式:iOSの場合 — px = pt × scale(scale = 1、2、または3)。Androidの場合 — px = dp ×(dpi / 160)。コードでpxを直接使用すると、異なる密度のデバイスでインターフェースの見え方が異なります:高PPI画面では要素が小さすぎ、低PPIでは大きすぎます。
モバイルアプリケーションのソースコードでpxを使用することは、異なるピクセル密度のデバイスでインターフェースが正しく表示されない原因となるアンチパターンです。最新のフレームワーク(UIKit、SwiftUI、Jetpack Compose、XML Layouts)は、ピクセルでのサイズ指定を禁止または推奨していません。
コードでpxを使用する唯一の正当なケースは、ラスターを扱う場合です:Bitmapの読み込み、Canvasでの画像レンダリング、MetalやOpenGLでの作業。これらの場合、pxはターゲットバッファの物理ピクセルであり、正しいレンダリングのために考慮する必要があります。それ以外のすべての場合、論理ユニットが使用されます。
画像とアイコンはピクセルで保存されますが、画面タイプごとに異なるバージョンが提供されます。iOSはAssets.xcassetsで@1x、@2x、@3xの接尾辞を使用します。Androidはdrawable-mdpi(1×)、drawable-hdpi(1.5×)、drawable-xhdpi(2×)、drawable-xxhdpi(3×)、drawable-xxxhdpi(4×)フォルダを使用します。システムは画面密度に基づいて自動的に正しいファイルを選択します。
| iOSスケール | Androidバケット | 係数 | 例(48 pt/dp) |
|---|---|---|---|
| @1x | mdpi(160 dpi) | 1× | 48 × 48 px |
| @2x | xhdpi(320 dpi) | 2× | 96 × 96 px |
| @3x | xxhdpi(480 dpi) | 3× | 144 × 144 px |
| — | xxxhdpi(640 dpi) | 4× | 192 × 192 px |
アセット提供ルール:ベクター形式(PDF、SVG)で画像を作成し、必要なサイズのラスターコピーにエクスポートします。ベクターアセットは品質を損なうことなくスケーリングでき、リポジトリの容量を節約します。Androidでは、VectorDrawableを介してベクターリソースを直接使用でき、複数のラスターコピーの必要性がなくなります。
よくある質問
px — 画面の物理ピクセル。dp(密度非依存ピクセル) — 160 dpiの密度の画面で1 pxに等しいAndroidの論理ユニット。異なる密度では、dpは自動的に異なる数のpxに変換され、要素の物理サイズを保持します。
pxは画面密度を考慮しないためです。100 pxの要素はPPIが異なるデバイスで異なって見えます:326 PPIの画面では460 PPIよりも大きく見えます。論理ユニット(dp、pt、sp)はこの問題を自動的に解決します。
PPI(1インチあたりのピクセル数) — ディスプレイの1インチあたりのピクセル数。計算式:PPI = √(w² + h²)/ d。ここでwとhはpx単位の解像度、dはインチ単位の対角線。PPIが高いほど画像は鮮明になります。AppleのRetinaディスプレイは300 PPIから始まります。
pxはラスターバッファを扱う場合に正当化されます:Bitmapの作成、Canvasでのレンダリング、Metal/OpenGLシェーダーのプログラミング、カメラ画像の処理。レイアウトとタイポグラフィでは、pxは使用されません — pt(iOS)、dp、sp(Android)が適用されます。
iOSの場合:UIScreen.main.nativeBoundsがpx単位のサイズを返します。Androidの場合:DisplayMetrics.widthPixelsとheightPixelsをcontext.resources.displayMetricsから取得。SwiftUIの場合:GeometryReaderがpt単位のサイズを返し、pxにするにはdisplayScaleを掛ける必要があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。