2010年6月2日水曜日

Android Dimension 単位

Android では px (ピクセル)以外にも dp や sp などの単位があります。

ドキュメントはこちら
http://developer.android.com/intl/ja/guide/topics/resources/more-resources.html#Dimension

dp (dip)
Density-independent Pixels

画面の物理的な密度に基づいた抽象的な単位。
この単位は 160 dpi の画面と対応していて、160 dpi の画面で 1 dp = 1 px になる。なので、dp-pixel 比は画面密度(解像度)に応じて変化するが、必ずしも正比例するわけではない。コンパイラは "dip"、"dp" のいずれも理解できるが、"dp" という記述のほうが "sp" との対応関係がよりわかりやすい。

sp
Scale-independent Pixels
dp に似た単位だが、ユーザーが設定したフォントサイズによって自動でスケールされる。フォントサイズを指定する場合には、この単位を使うことを推奨している。よって、sp で指定したサイズは、画面密度(解像度)とユーザーが設定したフォントサイズに依存する。

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

px
Pixels
ピクセル、画面の実際のピクセル数
デバイスによって、1インチ当たり異なるピクセル数を持つ可能性があり、実際に表示されるサイズが変わってくるため、この単位で測ることは推奨しない。

mm
Millimeters
ミリメートル、画面の物理的サイズに基づく。

in
Inches
インチ、画面の物理的サイズに基づく。




単位自体を res で定義することもできます

xmlファイル の場所
 res/values/filename.xml

ファイル名は任意 (dimens.xml とか)

構文:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen
name="dimension_name">dimension</dimen>
</resources>


name 属性が resource ID になります。

Java からアクセス: R.dimen.dimension_name
XML からアクセス: @[package:]dimen/dimension_name


要素:
<resources>
 必須、root node でないといけない、属性なし

<dimen>
 float で表現、数字の後に単位(dp, sp, pt, px, mm, in)

 属性
  name
   文字列、resource ID になる

例)res/values/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_height">25dp</dimen>
<dimen name="textview_width">150dp</dimen>
<dimen name="ball_radius">30dp</dimen>
<dimen name="font_size">16sp</dimen>
</resources>


Java 側で、この dimension にアクセスするには

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);


 getDimension(int)
 DisplayMetrics に応じて単位変換してくれる
 戻り値は float

 戻り値として int で返してほしい場合(例えば、setPadding に使うとか)は
 getDimensionPixelSize(int)
 戻り値が int なだけで、getDimension(int) と同じ
 integer pixels に変換してくれる。 

 getDimensionPixelOffset(int)
 というのもある
 戻り値は int
 raw pixels で使うための offset が返ってくる?らしい


XML 側でアクセスするには

<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/sixteen_sp"/>

1 件のコメント:

  1. いつも参考にさせてもらっています。
    非常に助かってます。ありがとうございます。

    返信削除