iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Android】dpってなんぞや

今回は Android アプリ開発において、なんとなくなぁなぁにしていた dp の理解を深めていきたいと思います✍️

f:id:yum_fishing:20210105122326p:plain

そもそもなんで 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 で、汎用密度が hdpiGalaxy S があったとします。hdpimdpi の1.5倍なので、mdpi での横幅のピクセル値は 480 / 1.5 = 320px になります。これにより Galaxy S で横幅いっぱいに表示できる dp値は 320dp であるということが分かります。

結論として dp を使う際に気を付けることは?

ここまで長々と書いてきましたが結論として下記の記事を参照させていただくと、 Android を搭載したスマホであれば 320~410 に収まるように 指定すればとりあえずは極端にレイアウトが崩れてしまうということはなさそうです。👷‍♀️

【Android】いまさら聞けないdp入門 - Qiita

また、汎用密度を使う以上それぞれの端末での若干の差異は出るので注意しておきましょう。

それでは、また明日🦅

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com