2015-12-25【Android】いまさら聞けないdp入門sellAndroiddpとは?Androidのデザインにおいて、必ず理解しておくべきポイントのひとつがdpについてです。pixels)とは密度非依存ピクセルのことで、dipとも呼ばれています。Androidはこのdpのおかげで多用な端末をサポートできているのです。Developerspx、dpi、dpdpを理解する上で欠かせない要素がpx(ピクセル)とdpi(画面密度)です。pxpx(pixel)というのはハードウェアで実装されている解像度そのものです。ピクセルとも言います。Androidでは端末によって画面解像度が大きく異なる場合があるため、pxで要素を表示すると端末の画面解像度に応じて表示される実サイズがまちまちになってしまいます。Androidアプリ上でピクセルを直接扱う局面は限られており、ほとんどが画像編集とOpenGL関連です。Densityと表現されることもあります。同じフルHD解像度の端末でもスマートフォンとタブレットではこのdpiが異なっているため、Androidではpxとdpiを考慮したdpという単位が必要だったのです。実際のdpiは端末ごとに異なるため、個別にサポートするのはあまり現実的ではありません。そこで、Androidではdpiをある範囲ごとにランク分けすることにしました。density)と呼ばれています。pixels)とは密度非依存ピクセルのことで、dipとも呼ばれます。密度に依存しないピクセルとは、どの画面密度でも同じように表示できるピクセル単位ということです。dpで指定した値を画面密度に応じて計算することで、実際の端末で表示するpxに変換することができます。このpxを表示してみるとどの端末でも同じように表示されるため、密度非依存ピクセルと呼んでいるのです。ここでいう密度とは汎用密度のことなので、実dpiが汎用密度の基準dpiからずれている端末ではわずかに表示サイズに違いが出ます。汎用密度ではこの問題を考慮し、細かく範囲を設定していますが、「厳密に同じサイズで表示されるわけではない」ということは覚えておく必要があります。汎用密度とdp、pxの関係は以下のようになっています。ldpiの倍率が0.75倍なため、dpでの指定は4の倍数を使うのが良いでしょう。pixel)があります。これは文字サイズの指定に用いるもので、画面密度に加えてフォントサイズの設定も考慮されています。端末のdp解像度dpの大きな利点のひとつは、端末のdp解像度をある程度絞り込めることです。汎用密度の範囲は端末の画面サイズをdpで表したときにうまく重なるように設定されているため、ほとんどの端末は一定のdp解像度範囲に収まります。スマートフォンであれば、横幅は320-410dpの範囲に収まるとされています。(以前は384dpまででしたが、Nexus6追加時に410dpに拡張されました)試しに、いくつかのNexus端末を元に計算してみましょう。Blogこのように、実解像度の違いに関わらず、dpでみた横幅は6台とも320-410dpの範囲に収まっていることがわかります。320-410dpで崩れないレイアウトを心がけておけばほとんどの端末で崩れることはありません。最近発売された端末のdp解像度の傾向は以下にまとめてあります。Qiitadpと画像Androidではアイコンなどの画像を利用する際、汎用密度ごとに適切な解像度の画像を用意することが推奨されています。これらの画像も一旦dpでデザインし、各画面密度に必要なピクセルを計算したほうが良いでしょう。例として、以下のようなアイコン画像を用意する場合をあげます。縦横48dpで上下左右に8dpずつの余白を持たせ、内側32dpをデザイン領域としています。128難点dpではできないこと、難しいこともあります。Androidでは汎用密度で計算したdpによる画面サイズが端末ごとに大きく変わらないという法則によってレイアウトを行います。物理的に極端に小さい端末や汎用密度の基準から極端に外れた端末ではdp換算された画面解像度が大きく異なる場合があります。イレギュラーな端末なのであまり考慮する必要はありませんが、サポート対象端末選定の際には該当端末のdpiとdp解像度を意識したほうが良いでしょう。スマートフォンとdpスマートフォンにおけるdpの注意点やTipsをまとめます。4インチ台の320dp端末も新機種が発売されており、直近で発売されたNexus端末は410dpを採用しています。このことから、320-410dp範囲の対応は必須と言えるでしょう。前述の通りスマートフォンの画面幅は320-410dpなので、まず320dpで配置します。320dpで各要素を配置できたら、410dpの場合にどのようなレイアウトになるかを考えます。各要素を伸縮させたり余白を広げたりして不自然なレイアウトにならないように工夫しましょう。このとき、RelativeLayoutを使ったりLinearLayoutのandroid:layout_weightを使うと自然に対応することができます。スマートフォンでの横向き表示に対応する場合、横幅が730dpに達する端末もあるので別レイアウトにするかどうかも考慮したほうが良いでしょう。詳しくはタブレット対応の項を参照してください。縦方向については480dp-730dpにおさまる場合が多いですが、横幅と違い端末のアスペクト比によってかなり差があります。ListViewやGridViewなどの縦スクロール要素をうまく使って余白が開きすぎないように調整しましょう。縦480dpで見切れないレイアウトであっても画面回転に対応する場合はスクロール領域を入れておくべきです。ある工夫リソースを最小短辺サイズ(sw360dpなど)で分割することにより、短辺があるサイズ以上の端末のみに代替リソースを提供することが出来ます。最小短辺サイズでリソースを分割する際はなるべくdimenを分割するようにしましょう。layoutを分割してしまうと、後々管理が大変になりがちです。タブレットとdpタブレットにおけるdpの注意点やTipsをまとめます。国内では最近のタブレットの解像度はアスペクト比16:10の1280x800pxや1920x1200px、2560x1600pxが主流ですが、画面サイズが大きいためスマートフォンとは汎用密度が異なることに注意する必要があります。Developersによると、dp解像度では短辺が600-800dp、長辺が960-1280dpの範囲におさまる想定になっています。タブレットのdp解像度をいくつか算出してみましょう。9も含め、全て範囲内におさまりました。いう倍率を持った特殊な汎用密度です。通常はmdpiとhdpiのリソースが必要に応じて流用されるため、これを直接ターゲットにして代替リソースを提供することは推奨されていません。スマートフォンとの違いタブレットの判定方法は、実は2種類あります。13で追加されたフラグのため、これ未満のタブレットでは適用できません。そのため、画面物理サイズに応じた指定(large/xlarge)を併用する場合があります。13未満のタブレットがほとんど流通していないため、xlarge設定が必要になる機会はあまりありません。幅ではなく短辺を使用するのは、単純に幅800dp(w800dp)で判定した場合では縦持ちしたタブレットが含まれず、幅600dp(w600dp)では横向きのスマートフォン端末が含まれる可能性があるためです。逆に、タブレット、スマートフォンにこだわらずにマルチペインを実装する場合は幅600dp(w600dp)あれば十分という考え方もできます。レイアウトにあわせた適切な代替リソースの提供を行いましょう。レイアウトの決め方まず、タブレット=横画面という思い込みを一旦捨てましょう。7インチタブレットの短辺600dpでもスマートフォンと比べるとかなり広いので、タブレットの場合は縦持ちであってもマルチペンレイアウトなどのタブレット向けUIを実装しているアプリは多いです。短辺/長辺でdpの範囲が区別されているとはいえ、10インチタブレット短辺の800dpは7インチタブレットの長辺960dpとそこまで大きくかわりません。おすすめのレイアウト方法のひとつは、すべてのAndroid端末を横幅320dp(または300dp)ごとに分類する方法です。name="columns">4</integer>上記の様に定義したintegerリソースをRecyclerViewやGridViewの列数として指定することで、スマートフォン縦向きでは1列、タブレット縦向きでは2列、小型タブレット横向きでは3列、より大きいタブレットでは4列...というように端末の画面領域に応じてコンテンツの密度を調整できます。(本来はw640dpで区別するのが良さそうですが、小型タブレットでの利便性を考慮してw600dpで設定しています)もちろんこのようなレイアウトはすべてのアプリに使えるものではないため、特に縦方向のサイズが重要なレイアウトではportやlandを使って端末の向き毎に代替リソースを提供したほうが良い場合もあります。その場合はsw600dp-landやsw960dp-landのように短辺と組み合わせて判定することでより厳密になります。ある工夫タブレットにおけるレイアウトのパターンについてはまとめました(古くなっています)。