背景
Androidは様々なスクリーンサイズ、画素数の端末が販売されています。その一つ一つに合わせてレイアウトのデザインを作り込むのは大変です。
例えば100ピクセルの画像を画面に表示するようなデザインの場合、以下のような問題が出てきます。
- 端末のピクセルの画面サイズに合わせて画像を拡大縮小させる必要がある
- 端末によるピクセル密度が異なることもあるため、同じピクセルサイズの画面でも物理的なサイズが違うため、見え方も違う
そのため、Androidではdp, spという画面サイズや解像度に捉われることなく扱うことを目的とした抽象的な単位を提供しています。
ピクセル密度とそれに対応した区分
Androidではdpiという「1インチあたりどれだけのピクセルが入っているか」の大きさによって端末の種類を区分けしています。
汎用密度 | 倍率 | 説明 |
---|---|---|
ldpi | x0.75 | 低密度(ldpi)画面(~120dpi)に適用するリソース |
mdpi | x1 | 中密度(mdpi)の画面(~160dpi)に適用するリソース(基準密度) |
hdpi | x1.5 | 高密度(hdpi)画面(~240dpi)に適用するリソース |
xhdpi | x2 | 超高密度(xhdpi)画面(~320dpi)に適用するリソース |
xxhdpi | x3 | 超超高密度(xxhdpi)画面(~480dpi)に適用するリソース |
xxxhdpi | x4 | 超超超高密度(xxxhdpi)の画面(~640dpi)用のリソース |
参考:https://developer.android.com/training/multiscreen/screendensities#TaskProvideAltBmp
表ではわかりにくいかもしれませんが、もしもレイアウトに1dpと指定した場合、実際のpx単位のサイズは以下になります。
汎用密度 | dp | px |
---|---|---|
ldpi | 1 | 0.75 |
mdpi | 1 | 1 |
hdpi | 1 | 1.5 |
xhdpi | 1 | 2 |
xxhdpi | 1 | 3 |
xxxhdpi | 1 | 4 |
0.75px? 1.5px?
「4の倍数」について
上記表からldpiとhdpiはかなり中途半端なpxサイズになってしまうのがわかるかと思います。
そこで、x0.75とx1.5という中途半端な倍率でも整数表示させるために登場したのがdpを「4の倍数」で指定するというものです。
dpを4の倍数で指定することで、各dpiの値は以下になります。
汎用密度 | dp倍率 | px倍率 |
---|---|---|
ldpi | x4 | x3 |
mdpi | x4 | x4 |
hdpi | x4 | x6 |
xhdpi | x4 | x8 |
xxhdpi | x4 | x12 |
xxxhdpi | x4 | x16 |
よって4の倍数を指定することでpxは常に整数が指定されるため、実際の端末でもきれいに表示させることができるようになります。
レイアウトデザインでサイズ指定をする際にはぜひ4の倍数に気をつけてみましょう。