marginとpaddingについては、感覚的にはCSSと同じです。ただ、border領域がありません。borderは別途background属性でdrawable(画像もしくは描画を表すxml)指定で表現することになります。
- padding・・・要素から青枠までの領域(background属性が適用される範囲)
- margin・・・青枠から赤枠までの領域
marginは他要素からの距離になるので、Root要素(一番最初に定義されるLayoutなりView
なり)にmarginを定義しても、あまり意味がありません(定義できるけど動作が変?)。
marginを定義するのは、何かしらの子要素に対してのみ、行いましょう。
では、サンプルを見てみましょう。
Sample02アプリを起動して、メニューを押してchapter09を選んでください。
以下のような画面になります。
LinearLayoutのhorizontalを3つ準備して
- marginのみ設定
- paddingのみ設定
- marginとpaddingの両方設定
を作ってみました。background属性がわかりやすいように、色を付けています。
パッと見た感じ、わかりにくいので、ちょっと解説用に矢印をつけたバージョンが以下です。
marginのみでTop, Leftなどを別々に指定みてみたところ、marginのみではその通りに反映されました。
ところが、paddingのみで指定したところ、marginのときのようにはなりませんでした。ベースラインがpaddingTopの高いほうに合わせられました。オレンジ枠の部分はmarginでもpaddingでもありません。
marginとpaddingの両方を指定したところ、思った通りの結果ですが、ベースラインはpaddingに合わせられ、marginも反映されました。
コードレビュー
ではレイアウトのコードを見てみましょう。 Sample02プロジェクトの/res/layout/chapter09.xmlを開いてください。<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <!-- marginを指定する場合は、layout_marginを使います。 個別に設定する場合は、 layout_marginTop, layout_marginBottom, layout_marginRight, layout_marginLeft です。 paddingを指定する場合は、paddingを使います。 個別に設定する場合は、 paddingTop, paddingBottom, paddingRight, paddingLeft です。 CSSのブロック要素と同じく、コンテンツの周囲がpaddingで paddingの外側がmarginです。 marginは、周囲の要素に対して有効なため、 Root要素(ここでは2行目で定義しているLinearLayout)でmarginを 定義しても有効ではありません。定義はできますが、動作が不確定ぽいです。 Root以下の子要素で定義してください。 --> <TextView android:text="@string/chapter09_margin" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- marginのみ設定 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="20dp" android:background="#008000" /> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:layout_marginLeft="20dp" android:background="#4b0082" /> </LinearLayout> <!-- paddingのみ設定 より大きな数値でpaddingが設定されている要素にベースラインが合ってしまうようです。 --> <TextView android:text="@string/chapter09_padding" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:paddingLeft="20dp" android:paddingBottom="10dp" android:paddingRight="20dp" android:background="#008000" /> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="40dp" android:paddingLeft="20dp" android:paddingBottom="20dp" android:paddingRight="40dp" android:background="#4b0082" /> </LinearLayout> <TextView android:text="@string/chapter09_margin_padding" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- marginとpaddingを設定 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:paddingTop="10dp" android:paddingLeft="20dp" android:paddingBottom="10dp" android:paddingRight="20dp" android:background="#008000" /> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:paddingTop="40dp" android:paddingLeft="20dp" android:paddingBottom="20dp" android:paddingRight="40dp" android:background="#4b0082" /> </LinearLayout> </LinearLayout>marginは以下のようにして指定します。
- layout_margin・・・上下左右すべて同じ値を指定したい場合
- layout_marginTop・・・上のみ指定
- layout_marginBottom・・・下のみ指定
- layout_marginLeft・・・左のみ指定
- layout_marginRight・・・右のみ指定
paddingは以下のようにして設定します。
- padding・・・上下左右すべて同じ値を指定したい場合
- paddingTop・・・上のみ指定
- paddingBottom・・・下のみ指定
- paddingLeft・・・左のみ指定
- paddingRight・・・右のみ指定
「いやいや!marginとpaddingの概念はわかったけども、そこに指定する値はどうやって算出するのさ!そもそもdpって何よ!?」って思ってる人が多いと思います。
なので、次はAndroidのレイアウトにおける単位を取り扱います。
0 件のコメント:
コメントを投稿