ピクセルからdipに変換する

マルチスクリーン

Android 端末は色々なメーカーが開発をしています。当然画面サイズも様々です。
アプリを開発していて悩ましいのは画面サイズが色々とあることでレイアウトを作るにはどうすればいいんだろうという事です。

layout.xml で dip という単位を使って部品を配置していればかなり気にしないで済むのですが、実際の開発でプログラム上で部品のサイズを指定しなければならないことがあります。

そもそも dip って何?ということもあると思いますが・・・・

dip

device-independent pixel の略です。
ネット上で自分が持っている端末使用を調べた時に 480 x 800 なんていうのを見ることがありますが、これの単位は pixel です。

英語で書かれているので読むのが大変だと思いますが詳細は下記ページに記載があります。
http://developer.android.com/intl/ja/guide/practices/screens_support.html


ldpi, mdpi, hdpi, xhdpi

Android でよく出てくる文字として hdpi があります。開発中もこの文字を見たことがあるのでは?
もっと見かけるもじだと WVGA だと思います。
携帯端末の使用をしらべて 480 x 800 というよりも WVGA という文字の方が多くみかけるかもしれません。

携帯電話の多くは WVGA です。WVGA 800, WVGA 854 と表現されることもあるようです。800 や 854 というのは何となく予想できると思いますが、480 x 800, 480 x 854 という長辺の数値です。

携帯電話向けのアプリを開発するのであれば WVGA 800 (480 x 800) に対応しておけば多くの端末に対応しているといえるのではないでしょうか。一部端末では WVGA と記載されているにもかかわらず領域の一部が使用できないということがあるので気を付けなければいけません。(au の IS03)

解像度による分類表は下記ページにあります。
http://developer.android.com/intl/ja/guide/practices/screens_support.html#testing


日本で発売されている携帯電話のほとんどはnormal screen、high density に属していますので、アプリ開発を行う際は normal screen, high density をターゲットとすればいいのではないでしょうか。

私は以上のことから画面レイアウトを作成する際は normal screen, high density をターゲットとして作成してから癖のある端末を使って微調整を行っています。

ターゲットを mdpi にしようが hdpi にしようが 携帯電話をターゲットとするレイアウトを作るのであれば横幅は 320 dip です。mdpi の 320 dip は 320 ピクセルです。 hdpi の 320 dip は 480 ピクセルです。

mdpi の 1ピクセルが 1 dip とされてます。
hdpi の 1.5 ピクセルが 1dip です。 正しい表現方法じゃないと思いますが・・・・

mdpi: 320 ピクセルは 320 [ピクセル]   /  1 [ピクセル / dip] = 320 [dip]
hdpi : 480 ピクセルは 480 [ピクセル]  / 1.5 [ピクセル / dip] = 320 [dip]

320 x 480 (normal screen, mdpi) と 480 x 800(normal screen, hdpi) の端末の場合
横幅はどちらの端末も 320 dip です。縦幅は異なりますが・・・・

部品サイズの指定で dip を使えば色々な端末に対応する際に気にしないで済むというのは以上のことからです。



ピクセルから dip に変換する

layout.xml で部品サイズを指定するときは単位に dip を使えば楽々なのですがプログラムでは dip という単位を直接指定することができません。

そのときにどうすればいいのか?

目視で端末の解像度を予想することはできそうですが、プログラム上でなんとかしないといけません。

1ピクセルに対する 1dip の倍率をプログラムで取得することができれば何とかなりそうです。


DisplayMetrics metrics = new DisplayMetrics();  

context.getWindowManager().getDefaultDisplay().getMetrics(metrics);  

※上記記述は間違いです。Activity内であればgetWindwoManager()が使えます。

WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);


wm.getDefaultDisplay().getMetrics(metrics);

      metrics.scaledDensity



metrics.scaledDensity

この値が 1 ピクセルに対する 1dip の倍率になります。

100 ピクセルdipを指定したければ

100 x metrics.scaledDensity とすれば mdpi, hdpi だけではなく ldpi, xdpi にも対応できます。

同じ比率で部品の拡大、縮小が行われるのでどの端末で見ても同じような画面を見ることができます。ただし、縦幅(長辺)が端末ごとに異なるので他にも工夫は必要です。少なくとも横(短辺)については同じ比率で表示されます。

0 件のコメント:

コメントを投稿