2012年3月24日

Androidレイアウトの単位 - dpについて掘り下げる


Androidで使われるpxはピクセル、dpは密度に依存しない仮想単位で、変換はdp×getDisplayMetrics().density=px。これを公式的に覚えておけば、実用的にはこと足ります。
しかし、もう一歩掘り下げて、解像度と密度の関係、物理サイズとdpiの関係、ピクセルとポイントの関係などをもう一度整理しなおしたいという人は続きを読んでみてください。

pxとdpについておさらい

pxはピクセルの意味です。プログラマにとっては一番馴染みがある単位でしょう。

dpはdipとも言い、Density Independent Pixelの略です。そのまま日本語にすると「密度に依存しないピクセル」となります。

dpはpxに対する比率として定義されていて、DisplayMetricsクラスのdensityというフィールドで参照できます。

依存しない、と言われれば、まーなんとなくデバイスや解像度が変わっても大丈夫っぽい感じがしますから、とりあえずこっち使っとけっていう雰囲気は伝わります。プログラミングなんて雰囲気ですから、それだけ分かっておけば大丈夫です。

しかし、じゃあちゃんと説明してみろと言われるとあんがい難しい。

今回はその辺を掘り下げていきましょう。

画面の物理サイズ

まず、Androidからいったん離れて、一般な例で考えてみます。

21インチ1920×1080のPCモニタを例にとると、次のようになります。

画面の大きさ幅46.4cm×幅26.1cm
解像度1920×1080

もう一つちょっと変わった例を挙げましょう。

渋谷駅前にQFRONTという商業ビルがあって、巨大なスクリーンがありますね。



あれは1日に200万人が目にするそうですが、あのスクリーンは次のような大きさだそうです。

画面の大きさ幅23.5メートル×幅19メートル
解像度約1100ピクセル×900ピクセル

解像度

解像度というのは、画面の物理的な大きさに関係なく、画面が何ドットで構成されているかということです。渋谷駅前巨大スクリーンを考えれば分かるように、解像度が同じでも画面サイズが大きくなれば、1ドットのサイズは大きくなります。ちなみに渋谷駅前スクリーンの場合は、1ピクセルのサイズは約2.08cmです。

PCモニタの例で言えば、46.4cmを1920等分したものが物理的な1ピクセルのサイズなので、約0.241mmです。

画面密度

画面密度というのは、1インチを何等分するかということで、dpi(Dot Per Inch)という単位であらわされます。

Androidでは、160dpiが標準の画面密度とされます。160dpiのとき、1ドットがほぼ1ピクセルにあたるということです。この数値は1.5インチ×2インチの物理サイズで240×320の解像度のスクリーンだそうですが、最近ではどんどん大画面化しているので、2.4インチ×3.2インチで480×800ピクセルあたりが主流でしょう。

ピクセルとdpi

ここで注意してもらいたいのは、ピクセルの大きさは固定(というか、ハードウェア的にそう作られているので変えようがない)であるのに対し、画面出力の際に表示や計算の単位となる*画面密度*は、ソフトウェア(多くの場合OS)が自由に決めることができるという点です。

画像や文字を160dpiで表示しようが2560dpiで表示しようが自由です。

ところが、画面密度を計算や表示の単位とすると、画面密度によって、目に見える大きさが変わってきてしまうという問題が生じます。





dpiの単位を1ドットと呼ぶことにすると、丸が画面上のピクセル、四角が1ドットです。先ほどの話を思い出してください。1/160インチ=1ドット=1ピクセルです。

いっぽう、たとえば240dpiの場合は




のようになります。図を見れば分かりますが、1ドットが1ピクセルに一致しません。1ドット=0.66ピクセルです。

ようやくdpの話

画面密度を高くすると、あるドット数であらわせるピクセル数は小さくなっていきます。

逆に画面密度を低くすると、あるドット数であらわせるピクセル数は大きくなる、ということです。

160dpiのとき、1ドット=1ピクセル
240dpiのとき、1ドット=0.66ピクセル

となります。

つまり、たとえば同じ100ドットと言っても、画面密度が160dpiのときと、240dpiのときとで、目に見えるサイズが変わります。

そこでAndroidに採用されたのがdpという単位が登場するわけです。

dp(dip)はDensity Independent Pixelの略、つまり「画面密度に依らないピクセル単位」という意味です。

dpというのは文字通り「仮想的な」単位で、何dpiであるとか、何mmであるといったように、物理的な数量とはいっさい結びついていないことに注意してください。

つまり、画面上の画素である「ピクセル」を基準として、それの何倍にあたるのか、という「計算ファクター」としてしか存在していないのです。

この値は機器ごとに変わり、端末メーカーが「ウチのこの機種はこの値」といっておのおの決めているわけです。

dpという単位が分かりにくい理由

ところで、dpiという単位は、元々が「画面の物理的なサイズに左右されないようにするための単位」でした。そのため、デザインの世界ではピクセルなどという単位は使われず、もっぱらdpiを単位とします。画面上であっても印刷物であっても、1インチと言えばそれは1インチの大きさをあらわします。96dpiであらわした1インチ(96ドット)と、300dpiであらわした1インチ(300ドット)は、もちろん同じサイズです。

しかし、スマートホンやタブレットのように物理サイズが固定されたデバイスが相手だと、今度は「dpiが変わると目に見える大きさが変わる」ので、「dpiが変わっても大きさが変わらない単位」というものが必要になってきたのです。

このような何周か回った感じが、dpという単位の分かりにくさにつながっています。

まとめ

最後に、XMLレイアウトを記述する際の心得を書いておきましょう。

1.XMLレイアウトでは、wrap_content、fill_parentを使うか、dpでサイズを指定する
2.アプリケーションコードでピクセル値を使ってはならない
3.AbsoluteLayoutは使ってはいけない
4.画面密度ごとに別々のビットマップを用意する

Android SDKのSupporting Multiple Screensというページに詳しい説明が載っています。

0 コメント:

コメントを投稿

長崎県 引越 見積もり 単身引っ越し 料金 還暦祝い 父 Blog Entry Ranking
" ); 出会い系を例示