【Android】dpってなんぞや
今回は Android
アプリ開発において、なんとなくなぁなぁにしていた dp
の理解を深めていきたいと思います✍️
そもそもなんで px
単位じゃない?
iOS
アプリ開発においてもこれは言えることですが、基本的にモバイルアプリの開発はマルチデバイスでのレイアウトを考慮した上で設計していく必要があります。同じ解像度の端末でもデバイスの大きさが違えば UI
の見え方(大きさやパディング)が違います。
例えば、極端に大きいオセロ盤と極端に小さいオセロ盤があったとしましょう。この二つのオセロ盤で同じくらいの大きさのコマを作りたいと思った場合にマス一つ分の大きさを基準にコマを作った場合どうなるでしょうか?大きいオセロ盤のコマは極端に大きく、小さいオセロ盤のコマは極端に小さくなってしまいます。オセロであれば、このようにコマの大きさに差異がでていてもいいかもしれませんが、モバイル端末において px
を指定すると、このオセロの例のように px
の物理的な大きさによって UI
が構築され相対的な見た目を維持するのが難しくなってしまいます。
Android
の場合iOS
とは異なり、様々な会社が出しているデバイス上でアプリを動作させることができるため、解像度やサイズもデバイスによって極端に異なる可能性がでてきます。
そこで登場するのが dp
です。
dp
とは?
dp
とは density independent pixels
の略で、その名の通り px
の密度に依存しない論理的な単位のことを指しています。つまり、解像度が同じで画面サイズが異なる端末同士でも、同じくらいの大きさの UI
を配置することができる相対的な単位です。
なんとなく dp
の概要が掴めるとこんな疑問が出てくると思います。「じゃあ、画面の横幅いっぱいに表示できる dp
は 何dp
なの?」この疑問を解消してくれるのが、dpi
です。
dpi
とは?
dpi
とは dots per inch
の略で、1インチあたりのピクセル数(ドット数)を表します。つまり、この値を使用すれば 1インチ
という物理的に固定されたサイズを基準にピクセル数を計算することができます。
しかし、多種多様なデバイスがある Android
では、それぞれの dpi
ごとに px
を計算していくのはあまり効率的ではありません。そこで登場したのが 汎用密度
です。
密度修飾子 | 倍率 | 説明 |
---|---|---|
ldpi | 0.75 | 低密度(ldpi)画面(~120dpi)に適用するリソース |
mdpi | 1.0(基準) | 中密度(mdpi)の画面(~160dpi)に適用するリソース(基準密度)。 |
hdpi | 1.5 | 高密度(hdpi)画面(~240dpi)に適用するリソース |
xhdpi | 2.0 | 超高密度(xhdpi)画面(~320dpi)に適用するリソース |
xxhdpi | 3.0 | 超超高密度(xxhdpi)画面(~480dpi)に適用するリソース |
xxxhdpi | 4.0 | 超超超高密度(xxxhdpi)の画面(~640dpi)用のリソース |
参照: https://developer.android.com/training/multiscreen/screendensities#TaskProvideAltBmp
汎用密度
は dpi
のしきい値ごとに値が決まっていて、それぞれのデバイスはこの値ごとにピクセルの換算を行うことができます。
そしてここでようやく 「じゃあ、画面の横幅いっぱいに表示できる
dpは
何dpなの?」
の問いに答えられるようになります。結論から述べると mdpi(基準)
でのピクセル値が dp
値になるので、そこから倍率をもとに計算することができます。
例えば解像度(px) が 480 x 800
で、汎用密度が hdpi
の Galaxy S
があったとします。hdpi
は mdpi
の1.5倍なので、mdpi
での横幅のピクセル値は 480 / 1.5 = 320px
になります。これにより Galaxy S
で横幅いっぱいに表示できる dp
値は 320dp
であるということが分かります。
結論として dp
を使う際に気を付けることは?
ここまで長々と書いてきましたが結論として下記の記事を参照させていただくと、 Android
を搭載したスマホであれば 320~410 に収まるように 指定すればとりあえずは極端にレイアウトが崩れてしまうということはなさそうです。👷♀️
また、汎用密度を使う以上それぞれの端末での若干の差異は出るので注意しておきましょう。
それでは、また明日🦅
参考
- Support different pixel densities | Android Developers
- 【Android】いまさら聞けないdp入門 - Qiita
- Androidのdip(dp)ってpxに換算すると何なのさ!-めんどくさいのでDip Calc作りました- — pucchon design