画面の解像度やdensity(ピクセル密度)の取得方法

By 山田
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Androidは、マルチスクリーンに対応しています。
これはどういう事かというと、解像度の異なる端末でも、同じように表示させる事ができる仕組みです。
ピクセル指定で画像を作成したり、プログラム上でレイアウトを制御すると、
高解像度の端末では、横幅が足りなかったり、ボタンが小さくて押せない、といった現象が起きます。

その為、解像度の異なる端末でも、一つのバイナリで対応させるには、それらを考慮した
実装が必要になります。
その解決法のいくつかをご紹介します。

1.layout.xmlにて、dip指定でサイズを指定
dipというのは、device-independent pixelの略で、直訳しますと
端末に依存しないピクセル
となります。
これはどういう単位か、というと、160 dpiの1ピクセルの物理的な大きさを1dipと定義しています。
つまり、320dpiのスクリーンを持つ端末では、1dip=2pixelという計算になります。
layout.xmにて、サイズを全てdip指定にするだけで、特に難しい事を考えることなく
マルチスクリーンに対応させる事ができます。

2.プログラムでscaleを取得
しかし、全てのレイアウトをxmlで記述するワケにもいかないのが、人情というものです。
プログラムで動的に変えなきゃいけないんだよ…という事もあると思います。
残念ながら、APIレベルでは、dipには対応していません。LayoutParamsのコンストラクタに
LayoutParams(100dip ,100dip)なんて書いてみても、コンパイルエラーが起きるだけです。
では、どうするかというと、現在のピクセルから何倍すれば1dipになるか、という計算をしてあげます。
そこらへんの情報を、以下のように取得できます。

ここで、metrics.scaledDensityという値があります。これが、現在の1ピクセルに対する1dipの倍率になります。
つまり、1ピクセル×scaledDensity=1dipとなります。

プログラムで横幅を指定したい場合は、上記を使うと良いでしょう。

詳しくは、公式サイトをどうぞ。
http://developer.android.com/intl/ja/guide/practices/screens_support.html

関連する投稿