スキップしてメイン コンテンツに移動

ピクセルから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 にも対応できます。

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

コメント

このブログの人気の投稿

Android ロックアプリを作る -調査編 -

Android 端末のスクリーンがOFFになると端末がロックされて、
スクリーンがONになるとロック画面が表示されます。

ロック画面は指の軌跡かパスワードを入力することで解除できます。

このロック画面をアプリとして作ってみたいと思い調査を始めることにしました。

調査の方針としては


色々なロックアプリをダウンロードしてみる。それぞれのパーミッションを見てみる。

という感じです。


色々なアプリをダウンロードしてみる。

まずはロックアプリ特集とかを探してみます。

Google 先生に聞いてみよう > Android ロックアプリ
結構出てきますね。


WidgetLocker LockscreenLockBot ProFロックスクリーン



それぞれのパーミッションを見てみる。

WidgetLocker Lockscreen



android.permission.VIBRATEandroid.permission.DISABLE_KEYGUARDandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.EXPAND_STATUS_BARandroid.permission.GET_TASKSandroid.permission.REORDER_TASKSandroid.permission.SET_PREFERRED_APPLICATIONSandroid.permission.WRITE_SETTINGSandroid.permission.WAKE_LOCKandroid.permission.CALL_PHONEandroid.permission.READ_SYNC_SETTINGSandroid.permission.GET_ACCOUNTSandroid.permission.READ_LOGSandroid.permission.SYSTEM_ALERT_WINDOWandroid.permission.WRITE_EXTERNAL_STORAGEandroid.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_WIFI_STATEcom.android.vending.CHECK_LICENSE
LockB…

携帯電話、タブレットの判定にピクセルではなくインチを使う

色々な案件に関わっていると、スマートフォンなのかタブレットなのかの判定をするためにピクセルを使用しているソースを見ることが多くあります。

幅、高さのそれぞれのピクセル数がある値を超えたらタブレットと判定する。


これはだめですよね

HTC j butterfly  はタブレットと判定されることが多くあります。




ディスプレイは約5インチ
w x h : 1080px x 1920px

5インチなので画面サイズが大きいということでタブレットという判定でもいいかもしれない・・・と思ったりしますが7インチ以上をタブレットと判定したい。。。




ピクセル数は画面のサイズ(インチ)とは違います。1080px x 1920px は5インチであるとは限りません。

i9220++ スマートフォン Android 4.0 3G GPS 5.2 インチ800万画素携帯(ブラック)

5.2インチ 画面解像度:960 x 540 pixels QHD screen


HTC j butterfly よりも画面サイズ(インチ)は大きいけれど、ピクセル数は少なくなってます。


ピクセル数で判定するのではなく、インチで判定したほうが正確ですね。



プログラムで画面サイズ(インチ)を計算してみましょう。

ディスプレイ情報を取得する ピクセル数(width, height)を取得するdpi (xdpi, ydpi) を取得する1インチあたりのピクセル数(dot per inch なのでドット数?) インチ(width, height) を計算する画面サイズ(インチ)を計算する
こんな流れになります。他に簡単に取得できる方法があれば教えていただけるとうれしいです。

Activity#onCreateに書きました

// ディスプレイ情報を取得する
final DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

// ピクセル数(width, height)を取得する
final int widthPx = metrics.widthPixels;
final int heightPx = metrics.heightPixels;

// dpi (xdpi, yd…

Mac の ターミナルから アプリをアンインストールする adb uninstall

ant uninstall でもいいんだけれど、ant プロジェクトじゃないこともあるのでメモ

adb uninstall パッケージ名
cVolume next をターミナルからアンインストールする場合
パッケージ名は jp.caldroid.cvolume40 なので

adb uninstall jp.caldroid.cvolume40
となる