単位

Posted by muchag | Android |
初回投稿:2011-04-08 (金) 14:25:48 | 最終更新:2011-04-19 (火) 14:01:44

あれこれサイトを見回って
色々なサンプルを見ていると、何か単位があれこれある・・・。

Android Developers:More Resource Types Dimension

種類
dp (=dip, Density-independent Pixels)

160 dpi の画面だと 1 dp = 1 px になる。
画面解像度が上がれば、それに応じて変化するが、必ずしも正比例するわけではない。
 

sp (Scale-independent Pixels)

dp に似た単位だが、ユーザーが設定したフォントサイズによって自動でスケールされる。
(=ユーザーが端末でフォントサイズを変更しているとその影響を受ける、という意味かしら)

フォントサイズを指定する場合には、この単位を使うことを推奨している。
よって、sp で指定したサイズは、画面密度(解像度)とユーザーが設定したフォントサイズに依存する。
 

pt (Points)

スクリーンの物理的サイズに基づいた 1/72 インチ。
 

px (Pixels)

ピクセル。
この単位で測ることは推奨しない。
 

mm (Millimeters)

ミリメートル。
 

in (Inches)

インチ。
 
ザックリ表現すれば
dp (= dip ), sp相対設定
pt, px, mm, in絶対設定

参考元サイト:Y.A.M の 雑記帳 Android Dimension 単位
 

具体的な利用法

 
この先は、下記リンク先ディスカッションを読みながら
公式リファレンスを見ながら個人的にまとめたものであり、
本人も確認はおろか理解もままならない状態です。
もし読み進める場合は、十分注意してください。
また、アドバイスがあればぜひお願いします。

(まぁ、元々私の覚書の精度は怪しいのですが、ここは特によくわかりません)
 
【教えてください】TextView等のテキストサイズについて
こちらで大変参考になるやり取りが行われていた。
上記参考元サイトの管理人さんも参加しておられる。
 

基本方針

レイアウトdpフォントサイズsp
これが基本らしい。

いずれも相対的な設定方法で
要は、例えば 20dp とか 20sp とかすれば
もし 160dpi (mdpi) の画面だったら 20px 分のサイズ(領域)になりますよ~。
画面サイズが異なる場合は、それに合わせて私(OS)が変更してあげますよ~。
ってこと。

ただし、AndroidManifest.xml ファイルにて

  1. <supports-screens android:anyDensity="true" />

としていなければ効力がない。
(Android 1.6 (API Level 4) 以降はデフォルトで true 設定なので特に必要はない・・・?)

android:anyDensity は、端末毎の画面解像度の差異を

  • true ・・・ OS に調整を任せる
  • false ・・・ 自分で調整する(端末毎の設定を作る)

ということだと思うんだけど、
上記参考サイトディスカッションを読んでみると
もしかしたら違うかも・・・。
 

各設定値の単位

私の参考書にもあった
setTextSize(20.0f)
という指定方法。
f ってなんじゃろ・・・と思いながらやってきたけど
f は float だった。

というわけで、参考書などの例では float 値で設定しているが
基本的には

setTextSize メソッドの引数の単位は sp

public void setTextSize (float size)

Android Developers:TextView setTextSize

でも、

setPadding メソッドの引数の単位は px

public void setPadding (int left, int top, int right, int bottom)

Android Developers:View setPadding

 

LayoutParams クラスのコンストラクタ引数も単位は px

public ViewGroup.LayoutParams (int width, int height)

Android Developers:ViewGroup.LayoutParams

 

絶対設定の場所で相対設定を行う

setPadding メソッドのように、引数に絶対設定を要求される場所で
相対設定を利用するには、

res/values/dimens.xml (ファイル名は自由)

にて

  1. <resources>
  2.     <dimen name="padding_left">20dp</dimen>
  3.     <dimen name="padding_top">15dp</dimen>
  4.     <dimen name="padding_right">10dp</dimen>
  5.     <dimen name="padding_bottom">5dp</dimen>
  6. </resources>

のような相対設定を定義するリソースを作成し

  1. Resources res = getResources();
  2. float paddingLeft = res.getDimensionPixelSize(R.dimen.padding_left);
  3. float paddingTop = res.getDimension(R.dimen.padding_top);
  4. float paddingRight = res.getDimension(R.dimen.padding_right);
  5. float paddingBottom = res.getDimension(R.dimen.padding_bottom);
  6. View.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);

というようにして、値を設定してやる。

こうすれば、
getDimension (戻り値 float)メソッド

getDimensionPixelSize (戻り値 int) メソッド
がリソースから値を取得するに当たり
それぞれの相対設定値(例えば 20dp)を絶対設定値に変換する途中で
画像サイズの差異を保管する比例定数を乗算した上で取得してくれる。

public float getDimension (int id)

Android Developers:Resources getDimension

public int getDimensionPixelSize (int id)

Android Developers:Resources getDimensionPixelSize

比例定数は、以下の通り。

  • 120dpi ・・・ 0.75
  • 160dpi ・・・ 1
  • 240dpi ・・・ 1.5

Android Developers:android:anyDensity

getDimension は、float を戻してくれるので
setTextSize などに有効。

getDimensionPixelSize は、int を戻してくれるので
setPadding などに有効。

と、上記ディスカッションを読みながら公式リファレンスを見て
このようにまとめてみたが、
ディスカッションを読み続けると、どうも間違っている気がする・・・。

正解は何なのか、今後のお楽しみということで。 😎
 
各端末の画面解像度およびサイズとどのように対応しているかは
以下の表を見ればわかる。

Low
density
(120),
ldpi
Medium
density
(160),
mdpi
High
density
(240),
hdpi
Extra
high
density
(320),
xhdpi
Small
screen
QVGA
(240×320)
Normal
screen
WQVGA400
(240×400)
WQVGA432
(240×432)
HVGA
(320×480)
WVGA800
(480×800)
WVGA854
(480×854)
Large
screen
WVGA800*
(480×800)
WVGA854*
(480×854)
Extra
Large
screen

* To emulate this configuration, specify a custom density of 160 when creating an AVD that uses a WVGA800 or WVGA854 skin.
Android Developers:Supporting Multiple Screens

Posted by muchag | Android |
初回投稿:2011-04-08 (金) 14:25:48 | 最終更新:2011-04-19 (火) 14:01:44

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment