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 件のコメント:
コメントを投稿