ドローアブル リソース

ドローアブル リソースは、画面に描画可能なグラフィックを示す一般的な概念です。getDrawable(int) などの API を使用して取得することも、android:drawableandroid:icon などの属性を持つ別の XML リソースに適用することもできます。ドローアブルには次のような種類があります。

ビットマップ ファイル
ビットマップ グラフィック ファイル(PNG、WEBP、JPG、GIF)。BitmapDrawable を作成します。
9-patch ファイル
コンテンツに応じて画像のサイズを変更できる、伸縮可能領域を含む PNG ファイル(.9.png)。NinePatchDrawable を作成します。
レイヤリスト
他のドローアブルの配列を管理するドローアブル。これらは配列順に描画されるため、インデックスが最も大きい要素が上部に描画されます。LayerDrawable を作成します。
状態リスト
状態ごとに異なるビットマップ グラフィックを参照する XML ファイル(たとえば、ボタンがタップされたときに別の画像を使用するなど)。StateListDrawable を作成します。
レベルリスト
複数の代替ドローアブルを管理するドローアブルを定義する XML ファイル。それぞれに最大数値が割り当てられます。LevelListDrawable を作成します。
遷移ドローアブル
2 つのドローアブル リソース間でクロスフェードできるドローアブルを定義する XML ファイル。TransitionDrawable を作成します。
インセット ドローアブル
指定した距離で別のドローアブルを挿入するドローアブルを定義する XML ファイル。これは、ビューの実際の境界よりも小さい背景ドローアブルが必要である場合に有用です。
クリップ ドローアブル
ドローアブルの現在のレベル値に基づいて別のドローアブルをクリップするドローアブルを定義する XML ファイル。ClipDrawable を作成します。
スケール ドローアブル
現在のレベル値に基づいて別のドローアブルのサイズを変更するドローアブルを定義する XML ファイル。ScaleDrawable を作成します。
シェイプ ドローアブル
色やグラデーションなどの幾何学的形状を定義する XML ファイル。GradientDrawable を作成します。

AnimationDrawable の作成方法については、アニメーション リソースのドキュメントをご覧ください。

注: カラーリソースは XML 内でドローアブルとして使用することもできます。たとえば、状態リスト ドローアブルを作成する場合には、android:drawable 属性のカラーリソースを参照できます(android:drawable="@color/green")。

ビットマップ

ビットマップ画像。Android はビットマップ ファイルの形式として、PNG(推奨)、WEBP(推奨。API レベル 17 以上が必要)、JPG(許容)、GIF(非推奨)をサポートしています。

ファイル名をリソース ID として、ビットマップ ファイルを直接参照するか、XML 内でエイリアス リソース ID を作成します。

注: ビットマップ ファイルは、ビルドプロセス時、aapt ツールによって可逆画像圧縮で自動的に最適化されます。たとえば、256 色を超える色を必要としないトゥルーカラーの PNG を、カラーパレットを使用する 8 ビットの PNG に変換できます。これにより、画質を変えずにメモリ使用量を少なくできます。

その結果、このディレクトリに配置された画像バイナリは、ビルド時に変更される可能性があります。画像をビットマップに変換するためにビット ストリームとして読み込む場合は、代わりに画像を res/raw/ フォルダに保存し、最適化されないようにします。

ビットマップ ファイル

ビットマップ ファイルは、PNG、WEBP、JPG、GIF 形式のファイルです。これらのファイルを res/drawable/ ディレクトリに保存すると、Android ではこれらのファイルについて Drawable リソースを作成します。

ファイルの場所:
res/drawable/filename.png.png.webp.jpg.gif
ファイル名はリソース ID です。
コンパイルされるリソースのデータ型:
BitmapDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
例:
画像を res/drawable/myimage.png に保存すると、次のレイアウト XML によって画像がビューに適用されます。
<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/myimage" />

次のアプリケーション コードは、画像を Drawable として取得します。

Kotlin

val drawable: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.myimage, null)

Java

Resources res = getResources();
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null);
関連項目:

XML ビットマップ

XML ビットマップは、特定のビットマップ ファイルを指定する、XML で定義されるリソースです。これは元のビットマップ ファイルのエイリアスになります。XML では、ディザリングやタイリングなど、ビットマップの追加プロパティを指定できます。

注: <bitmap> 要素は <item> 要素の子要素として使用できます。たとえば、状態リストまたはレイヤリストを作成する場合には、<item> 要素から android:drawable 属性を除外して、ドローアブル アイテムを定義する <bitmap> をその内部にネストします。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
BitmapDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:mipMap=["true" | "false"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
要素:
<bitmap>
必須。ビットマップ ソースとプロパティを定義します。

属性:

xmlns:android
文字列。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。これは、<bitmap> がルート要素である場合にのみ必要です。<bitmap><item> 内にネストされている場合は不要です。
android:src
ドローアブル リソース。必須。ドローアブル リソースへの参照。
android:antialias
ブール値。アンチエイリアスを有効または無効にします。
android:dither
ブール値。ビットマップが画面と同じピクセル構成を持たない場合(たとえば RGB 565 の画面に対してビットマップが ARGB 8888)、ビットマップのディザリングを有効または無効にします。
android:filter
ブール値。ビットマップ フィルタリングを有効または無効にします。フィルタリングは、ビットマップを縮小するか引き伸ばして外観を滑らかにする場合に使用します。
android:gravity
キーワード。ビットマップのグラビティを定義します。ビットマップがコンテナよりも小さい場合、グラビティはコンテナ内のドローアブルの位置を示します。

次の定数値を 1 つ以上含める必要があります(「|」で区切ります)。

説明
top オブジェクトのサイズを変更せずにコンテナの上端に配置します。
bottom オブジェクトのサイズを変更せずにコンテナの下端に配置します。
left オブジェクトのサイズを変更せずにコンテナの左端に配置します。
right オブジェクトのサイズを変更せずにコンテナの右端に配置します。
center_vertical オブジェクトのサイズを変更せずに、コンテナの垂直軸の中央に配置します。
fill_vertical 必要に応じて、オブジェクトの垂直方向のサイズをコンテナいっぱいまで拡大します。
center_horizontal オブジェクトのサイズを変更せずに、コンテナの水平軸の中央に配置します。
fill_horizontal 必要に応じて、オブジェクトの水平方向のサイズをコンテナいっぱいまで拡大します。
center オブジェクトのサイズを変更せずに、コンテナの垂直軸と水平軸の中央に配置します。
fill 必要に応じて、オブジェクトの水平方向と垂直方向のサイズをコンテナいっぱいまで拡大します。これがデフォルトです。
clip_vertical 子の上端や下端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは垂直方向のグラビティに基づきます。上部のグラビティは下端をクリップし、下部のグラビティは上端をクリップします。どちらも両端をクリップすることはありません。
clip_horizontal 子の左端や右端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは水平方向のグラビティに基づきます。左のグラビティは右端をクリップし、右のグラビティは左端をクリップします。どちらも両端をクリップすることはありません。
android:mipMap
ブール値。mipmap のヒントを有効または無効にします。詳しくは、setHasMipMap() をご覧ください。デフォルト値は false です。
android:tileMode
キーワード。タイルモードを定義します。タイルモードを有効にすると、ビットマップが繰り返されます。タイルモードが有効な場合、グラビティは無視されます。

次のいずれかの定数値を指定する必要があります。

説明
disabled ビットマップをタイル表示しません。これがデフォルト値です。
clamp シェーダーが元の境界の外側に描画される場合に、エッジの色を複製します。
repeat シェーダーの画像を水平方向と垂直方向に繰り返します。
mirror 隣接する画像が対称になるようにミラー画像を切り替えながら、シェーダーの画像を水平方向と垂直方向に繰り返します。
例:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    android:tileMode="repeat" />
関連項目:

9-patch

NinePatch は PNG 画像であり、ビュー内のコンテンツが通常の画像境界を超えた場合に Android がスケーリングする伸縮可能領域を定義できます。このタイプの画像は通常、少なくとも 1 つのディメンションが "wrap_content" に設定されたビューの背景として割り当てます。

ビューがコンテンツに合わせて拡大すると、9-patch 画像もビューのサイズに合わせてスケーリングされます。9-patch 画像の使用例としては、Android の標準 Button ウィジェットで使用される背景があります。これは、ボタン内のテキスト(または画像)に合わせて拡大する必要があり、9-patch が適しています。

通常のビットマップと同様に、9-patch ファイルを直接、または XML で定義されたリソースから参照できます。

伸縮可能領域を指定して 9-patch ファイルを作成する方法について詳しくは、サイズ変更可能なビットマップ(9-patch ファイル)を作成するをご覧ください。

9-patch ファイル

ファイルの場所:
res/drawable/filename.9.png
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
NinePatchDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
例:
次のレイアウト XML は、res/drawable/myninepatch.9.png に保存された画像を使用して、ビューに 9-patch を適用します。
<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/myninepatch" />
関連項目:

XML 9-patch

XML 9-patch は、9-patch ファイルを指定する、XML で定義されるリソースです。XML では画像のディザリングを指定できます。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
NinePatchDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:dither=["true" | "false"] />
要素:
<nine-patch>
必須。9-patch ソースとプロパティを定義します。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:src
ドローアブル リソース。必須。9-patch ファイルへの参照。
android:dither
ブール値。ビットマップが画面と同じピクセル構成を持たない場合(たとえば RGB 565 の画面に対してビットマップが ARGB 8888)、ビットマップのディザリングを有効または無効にします。
例:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/myninepatch"
    android:dither="false" />

レイヤリスト

LayerDrawable は、他のドローアブルの配列を管理するドローアブル オブジェクトです。リスト内の各ドローアブルはリストの順序で描画されます。リストの最後のドローアブルが上部に描画されます。

各ドローアブルは、1 つの <layer-list> 要素内の <item> 要素で表します。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
LayerDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</layer-list>
要素:
<layer-list>
必須。これはルート要素でなければなりません。1 つまたは複数の <item> 要素を格納します。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
<item>
属性によって定義された位置で、レイヤ ドローアブル内に配置するドローアブルを定義します。<layer-list> 要素の子を指定する必要があります。子 <bitmap> 要素を使用できます。

属性:

android:drawable
ドローアブル リソース。必須。ドローアブル リソースへの参照。
android:id
リソース ID。このドローアブルの一意のリソース ID です。このアイテムの新しいリソース ID を作成するには、"@+id/name" の形式を使用します。プラス記号は、これが新しい ID として作成されることを示します。この ID を使用して、View.findViewById() または Activity.findViewById() でドローアブルを取得して変更できます。
android:top
ディメンション。上部のオフセット。ディメンション値またはディメンション リソースで指定します。
android:right
ディメンション。右のオフセット。ディメンション値またはディメンション リソースで指定します。
android:bottom
ディメンション。下部のオフセット。ディメンション値またはディメンション リソースで指定します。
android:left
ディメンション。左のオフセット。ディメンション値またはディメンション リソースで指定します。

デフォルトでは、ドローアブル アイテムはすべて、含まれるビューのサイズに合わせてスケーリングされます。そのため、画像をレイヤリストのさまざまな位置に配置すると、ビューのサイズが大きくなり、一部の画像がそれに応じてスケーリングされる可能性があります。

リスト内のアイテムがスケーリングされないようにするには、<item> 要素内の <bitmap> 要素を使用してドローアブルを指定し、スケーリングしないもの("center" など)に対してグラビティを定義します。たとえば次の <item> は、コンテナのビューに合わせてスケーリングされるアイテムを定義しています。

<item android:drawable="@drawable/image" />

次の例では、スケーリングを回避するために、中心にグラビティを置いた <bitmap> 要素を使用しています。

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
例:
res/drawable/layers.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <bitmap android:src="@drawable/android_red"
        android:gravity="center" />
    </item>
    <item android:top="10dp" android:left="10dp">
      <bitmap android:src="@drawable/android_green"
        android:gravity="center" />
    </item>
    <item android:top="20dp" android:left="20dp">
      <bitmap android:src="@drawable/android_blue"
        android:gravity="center" />
    </item>
</layer-list>

この例では、ネストされた <bitmap> 要素を使用して、"center" グラビティを置き、各アイテムのドローアブル リソースを定義しています。これにより、オフセット画像によるサイズ変更があっても、コンテナのサイズに合わせて画像がスケーリングされなくなります。

次のレイアウト XML は、ビューにドローアブルを適用しています。

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

その結果、順次オフセットされた画像が積み重ねられます。

関連項目:

状態リスト

StateListDrawable は、XML で定義されるドローアブル オブジェクトです。オブジェクトの状態に応じて、複数の画像を使用して同じグラフィックを表します。たとえば、Button ウィジェットの状態には、タップされている状態、フォーカスされている状態、どちらでもない状態があり、状態リスト ドローアブルを使用することで、状態ごとに別の背景画像を表示することができます。

状態リストは XML ファイル内で記述します。各グラフィックは、1 つの <selector> 要素内の <item> 要素で指定します。各 <item> 内で、さまざまな属性を使用して、ドローアブルのグラフィックとして使用する状態を記述します。

状態が変化するたびに、状態リストが上から下にトラバースされ、現在の状態に合致する最初のアイテムが使用されます。「ベストマッチ」に基づく選択ではなく、対象状態の最小基準を満たす最初のアイテムが選択されます。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
StateListDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]
    android:dither=["true" | "false"]
    android:variablePadding=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_hovered=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_activated=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>
要素:
<selector>
必須。これはルート要素でなければなりません。1 つまたは複数の <item> 要素を格納します。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:constantSize
ブール値。状態が変化してもドローアブルの内部サイズを一定(すべての状態に適用できる最大のサイズ)にする場合は true に設定します。現在の状態に基づいてサイズを変化させる場合は false に設定します。デフォルトは false です。
android:dither
ブール値。ビットマップが画面と同じピクセル構成を持たない場合(たとえば RGB 565 の画面に対してビットマップが ARGB 8888)、true でビットマップのディザリングが有効になり、false で無効になります。デフォルトは true です。
android:variablePadding
ブール値。選択された現在の状態に基づいてドローアブルのパディングを変化させる場合は true、パディングを(すべての状態の最大パディングに基づいて)一定にする場合は false に設定します。この機能を有効にするには、状態が変化したときにレイアウトを処理する必要がありますが、多くの場合これはサポートされていません。デフォルトは false です。
<item>
特定の状態で使用するドローアブルを定義します。ドローアブルと状態については、各属性で指定します。<selector> 要素の子を指定する必要があります。

属性:

android:drawable
ドローアブル リソース。必須。ドローアブル リソースへの参照。
android:state_pressed
ブール値。オブジェクトがタップされたとき(ボタンをタップしたときなど)にこのアイテムを使用する場合は true、タップされていないデフォルトの状態のときにこのアイテムを使用する場合は false に設定します。
android:state_focused
ブール値。オブジェクトに入力フォーカスがあるとき(ユーザーがテキスト入力を選択したときなど)にこのアイテムを使用する場合は true、フォーカスされていないデフォルトの状態のときにこのアイテムを使用する場合は false に設定します。
android:state_hovered
ブール値。オブジェクトにカーソルが合っているときにこのアイテムを使用する場合は true、カーソルが合っていないデフォルトの状態のときにこのアイテムを使用する場合は false に設定します。多くの場合、このドローアブルは「フォーカス」された状態で使用されるドローアブルと同じです。

API レベル 14 で導入されました。

android:state_selected
ブール値。オブジェクトがユーザーによって選択され、方向コントロールによって移動するとき(D-pad でリスト内を移動するときなど)にこのアイテムを使用する場合は true、オブジェクトが選択されていないときにこのアイテムを使用する場合は false に設定します。

選択された状態は、android:state_focused が不十分な場合(リストビューにフォーカスがあり、その中のアイテムが D-pad で選択された場合など)に使用されます。

android:state_checkable
ブール値。オブジェクトが選択可能なときにこのアイテムを使用する場合は true、オブジェクトが選択可能でないときにこのアイテムを使用する場合は false に設定します。この属性が意味を持つのは、選択可能なウィジェットと選択不可能なウィジェットとの間でオブジェクトが遷移できる場合に限られます。
android:state_checked
ブール値。オブジェクトが選択可能なときにこのアイテムを使用する場合は true、オブジェクトが選択可能でないときにこのアイテムを使用する場合は false に設定します
android:state_enabled
ブール値。オブジェクトが有効状態のとき(タップイベントまたはクリック イベントを受け取ることができるとき)にこのアイテムを使用する場合は true、オブジェクトが無効状態のときにこのアイテムを使用する場合は false に設定します。
android:state_activated
ブール値。オブジェクトを永続的な選択としてアクティブにするとき(永続的なナビゲーション ビューで以前に選択されたリストアイテムを「ハイライト」するなど)にこのアイテムを使用する場合は true、オブジェクトがアクティブでないときにこのアイテムを使用する場合は false に設定します。

API レベル 11 で導入されました。

android:state_window_focused
ブール値。アプリ ウィンドウにフォーカスがあるとき(アプリがフォアグラウンドにあるとき)にこのアイテムを使用する場合は true、アプリ ウィンドウにフォーカスがないとき(通知シェードをプルダウンしたときやダイアログが表示されたときなど)にこのアイテムを使用する場合は false に設定します。

注: Android では、状態リストでオブジェクトの現在の状態と一致する最初のアイテムが適用されます。したがって、リスト内の最初のアイテムに上記の状態属性がいずれも含まれていない場合、そのアイテムが毎回適用されることになります。このため、次の例に示すように、デフォルト値を常に最後に配置する必要があります。

例:
res/drawable/button.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered -->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

このレイアウト XML は、状態リストのドローアブルをボタンに適用します。

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
関連項目:

レベルリスト

複数の代替ドローアブルを管理するドローアブル。それぞれに最大数値が割り当てられます。setLevel() でドローアブルのレベル値を設定すると、メソッドに渡される値以上の android:maxLevel 値を持つドローアブル リソースが、レベルリストに読み込まれます。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
LevelListDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/drawable_resource"
        android:maxLevel="integer"
        android:minLevel="integer" />
</level-list>
要素:
<level-list>
必須。これはルート要素でなければなりません。1 つまたは複数の <item> 要素を格納します。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
<item>
特定のレベルで使用するドローアブルを定義します。

属性:

android:drawable
ドローアブル リソース。必須。挿入されるドローアブル リソースへの参照。
android:maxLevel
整数。このアイテムに適用できる最大レベル。
android:minLevel
整数。このアイテムに適用できる最小レベル。
例:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/status_off"
        android:maxLevel="0" />
    <item
        android:drawable="@drawable/status_on"
        android:maxLevel="1" />
</level-list>

これを View に適用すると、レベルを setLevel() または setImageLevel() によって変更できます。

関連項目:

遷移ドローアブル

TransitionDrawable は、2 つのドローアブル リソース間でクロスフェードできるドローアブル オブジェクトです。

各ドローアブルは、1 つの <transition> 要素内の <item> 要素で表します。使用できるアイテムは 2 つまでです。前方に遷移させるには startTransition() を呼び出します。後方に遷移させるには reverseTransition() を呼び出します。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
TransitionDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>
要素:
<transition>
必須。これはルート要素でなければなりません。1 つまたは複数の <item> 要素を格納します。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
<item>
ドローアブル遷移の一部として使用するドローアブルを定義します。<transition> 要素の子を指定する必要があります。子 <bitmap> 要素を使用できます。

属性:

android:drawable
ドローアブル リソース。必須。ドローアブル リソースへの参照。
android:id
リソース ID。このドローアブルの一意のリソース ID です。このアイテムの新しいリソース ID を作成するには、"@+id/name" の形式を使用します。プラス記号は、これが新しい ID として作成されることを示します。この ID を使用して、View.findViewById() または Activity.findViewById() でドローアブルを取得して変更できます。
android:top
整数。上部のオフセット(ピクセル単位)。
android:right
整数。右のオフセット(ピクセル単位)。
android:bottom
整数。下部のオフセット(ピクセル単位)。
android:left
整数。左のオフセット(ピクセル単位)。
例:
res/drawable/transition.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

次のレイアウト XML は、ビューにドローアブルを適用しています。

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

次のコードは、最初のアイテムから 2 番目のアイテムへの 500 ミリ秒の遷移を実行します。

Kotlin

val button: ImageButton = findViewById(R.id.button)
val drawable: Drawable = button.drawable
if (drawable is TransitionDrawable) {
    drawable.startTransition(500)
}

Java

ImageButton button = (ImageButton) findViewById(R.id.button);
Drawable drawable = button.getDrawable();
if (drawable instanceof TransitionDrawable) {
    ((TransitionDrawable) drawable).startTransition(500);
}
関連項目:

インセット ドローアブル

指定した距離で別のドローアブルを挿入する、XML で定義されるドローアブルです。これは、ビューの背景をビューの実際の境界よりも小さくする場合に有用です。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
InsetDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
要素:
<inset>
必須。インセット ドローアブルを定義します。これはルート要素でなければなりません。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:drawable
ドローアブル リソース。必須。挿入されるドローアブル リソースへの参照。
android:insetTop
ディメンション。上部のインセット。ディメンション値またはディメンション リソースで指定します。
android:insetRight
ディメンション。右のインセット。ディメンション値またはディメンション リソースで指定します。
android:insetBottom
ディメンション。下部のインセット。ディメンション値またはディメンション リソースで指定します。
android:insetLeft
ディメンション。左のインセット。ディメンション値またはディメンション リソースで指定します。
例:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/background"
    android:insetTop="10dp"
    android:insetLeft="10dp" />
関連項目:

クリップ ドローアブル

ドローアブルの現在のレベルに基づいて別のドローアブルをクリップする、XML で定義されるドローアブルです。レベルに基づいて子ドローアブルがクリップされる幅および高さと、その子ドローアブルのコンテナ内での全体的な配置を決定するグラビティを制御できます。ほとんどの場合、進行状況バーなどの実装に使用されます。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
ClipDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal" | "vertical"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
要素:
<clip>
必須。クリップ ドローアブルを定義します。これはルート要素でなければなりません。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:drawable
ドローアブル リソース。必須。クリップするドローアブル リソースへの参照。
android:clipOrientation
キーワード。クリップの向き。

次のいずれかの定数値を指定する必要があります。

説明
horizontal ドローアブルを水平方向にクリップします。
vertical ドローアブルを垂直方向にクリップします。
android:gravity
キーワード。ドローアブル内のどこでクリップするかを指定します。

次の定数値を 1 つ以上含める必要があります(「|」で区切ります)。

説明
top オブジェクトのサイズを変更せずにコンテナの上端に配置します。clipOrientation"vertical" に指定すると、ドローアブルの下部でクリッピングを行います。
bottom オブジェクトのサイズを変更せずにコンテナの下端に配置します。clipOrientation"vertical" に指定すると、ドローアブルの上部でクリッピングを行います。
left オブジェクトのサイズを変更せずにコンテナの左端に配置します。これがデフォルトです。clipOrientation"horizontal" に指定すると、ドローアブルの右側でクリッピングを行います。
right オブジェクトのサイズを変更せずにコンテナの右端に配置します。clipOrientation"horizontal" に指定すると、ドローアブルの左側でクリッピングを行います。
center_vertical オブジェクトのサイズを変更せずに、コンテナの垂直軸の中央に配置します。クリップは、グラビティが "center" の場合と同じように動作します。
fill_vertical 必要に応じて、オブジェクトの垂直方向のサイズをコンテナいっぱいまで拡大します。clipOrientation"vertical" に指定すると、ドローアブルが垂直方向のスペースいっぱいに表示されるため、クリッピングは行われません(ただしドローアブルのレベルが 0 の場合は非表示になります)。
center_horizontal オブジェクトのサイズを変更せずに、コンテナの水平軸の中央に配置します。クリップは、グラビティが "center" の場合と同じように動作します。
fill_horizontal 必要に応じて、オブジェクトの水平方向のサイズをコンテナいっぱいまで拡大します。clipOrientation"horizontal" に指定すると、ドローアブルが水平方向のスペースいっぱいに表示されるため、クリッピングは行われません(ただしドローアブルのレベルが 0 の場合は非表示になります)。
center オブジェクトのサイズを変更せずに、コンテナの垂直軸と水平軸の中央に配置します。clipOrientation"horizontal" に指定すると、左側と右側でクリッピングを行います。clipOrientation"vertical" に指定すると、上部と下部でクリッピングを行います。
fill 必要に応じて、オブジェクトの水平方向と垂直方向のサイズをコンテナいっぱいまで拡大します。ドローアブルが水平方向と垂直方向のスペースいっぱいに表示されるため、クリッピングは行われません(ただしドローアブルのレベルが 0 の場合は非表示になります)。
clip_vertical 子の上端や下端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは垂直方向のグラビティに基づきます。上部のグラビティは下端をクリップし、下部のグラビティは上端をクリップします。どちらも両端をクリップすることはありません。
clip_horizontal 子の左端や右端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは水平方向のグラビティに基づきます。左のグラビティは右端をクリップし、右のグラビティは左端をクリップします。どちらも両端をクリップすることはありません。
例:
res/drawable/clip.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/android"
    android:clipOrientation="horizontal"
    android:gravity="left" />

次のレイアウト XML は、クリップ ドローアブルをビューに適用します。

<ImageView
    android:id="@+id/image"
    android:src="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

次のコードでドローアブルを取得し、画像が徐々に表示されるようにクリップする量を増やします。

Kotlin

val imageview: ImageView = findViewById(R.id.image)
val drawable: Drawable = imageview.background
if (drawable is ClipDrawable) {
    drawable.level = drawable.level + 1000
}

Java

ImageView imageview = (ImageView) findViewById(R.id.image);
Drawable drawable = imageview.getBackground();
if (drawable instanceof ClipDrawable) {
    ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000);
}

レベルを上げると、クリップする量が減り、画像がゆっくりと表示されます。レベル 7,000 では次のようになります。

注: デフォルトのレベルは 0 です。この場合、画像は全体がクリップされ、表示されません。レベルが 10,000 の場合、画像はクリップされず、完全に表示されます。

関連項目:

スケール ドローアブル

現在のレベルに基づいて別のドローアブルのサイズを変更する、XML で定義されるドローアブルです。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
ScaleDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                          "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
要素:
<scale>
必須。スケール ドローアブルを定義します。これはルート要素でなければなりません。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:drawable
ドローアブル リソース。必須。ドローアブル リソースへの参照。
android:scaleGravity
キーワード。スケーリング後のグラビティの位置を指定します。

次の定数値を 1 つ以上含める必要があります(「|」で区切ります)。

説明
top オブジェクトのサイズを変更せずにコンテナの上端に配置します。
bottom オブジェクトのサイズを変更せずにコンテナの下端に配置します。
left オブジェクトのサイズを変更せずにコンテナの左端に配置します。これがデフォルトです。
right オブジェクトのサイズを変更せずにコンテナの右端に配置します。
center_vertical オブジェクトのサイズを変更せずに、コンテナの垂直軸の中央に配置します。
fill_vertical 必要に応じて、オブジェクトの垂直方向のサイズをコンテナいっぱいまで拡大します。
center_horizontal オブジェクトのサイズを変更せずに、コンテナの水平軸の中央に配置します。
fill_horizontal 必要に応じて、オブジェクトの水平方向のサイズをコンテナいっぱいまで拡大します。
center オブジェクトのサイズを変更せずに、コンテナの垂直軸と水平軸の中央に配置します。
fill 必要に応じて、オブジェクトの水平方向と垂直方向のサイズをコンテナいっぱいまで拡大します。
clip_vertical 子の上端や下端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは垂直方向のグラビティに基づきます。上部のグラビティは下端をクリップし、下部のグラビティは上端をクリップします。どちらも両端をクリップすることはありません。
clip_horizontal 子の左端や右端をコンテナの境界でクリップするように設定できる追加オプション。このクリップは水平方向のグラビティに基づきます。左のグラビティは右端をクリップし、右のグラビティは左端をクリップします。どちらも両端をクリップすることはありません。
android:scaleHeight
割合。ドローアブルの境界に対する割合で表される、スケールの高さ。この値の形式は XX% です(100% や 12.5% など)。
android:scaleWidth
割合。ドローアブルの境界に対する割合で表される、スケールの幅。この値の形式は XX% です(100% や 12.5% など)。
例:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%" />
関連項目:

シェイプ ドローアブル

これは XML で定義される汎用的なシェイプです。

ファイルの場所:
res/drawable/filename.xml
ファイル名はリソース ID です
コンパイルされるリソースのデータ型:
GradientDrawable へのリソース ポインタ。
リソースの参照:
Java 内: R.drawable.filename
XML 内: @[package:]drawable/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
</shape>
要素:
<shape>
必須。シェイプ ドローアブル。これはルート要素でなければなりません。

属性:

xmlns:android
文字列。必須。XML 名前空間を定義します。"http://schemas.android.com/apk/res/android" にする必要があります。
android:shape
キーワード。シェイプの種類を定義します。有効な値は次のとおりです。
説明
"rectangle" ビュー全体に表示される長方形。これがデフォルトのシェイプです。
"oval" ビューのディメンション全体に表示される楕円形。
"line" ビューの幅全体にわたる横線。このシェイプでは、線の幅を定義する <stroke> 要素が必要です。
"ring" リング形のシェイプ。

android:shape="ring" の場合のみ、次の属性を使用します。

android:innerRadius
ディメンション。リングの内側(中央の穴の部分)の半径。ディメンション値またはディメンション リソースで指定します。
android:innerRadiusRatio
浮動小数点数。リングの内側の半径を、リングの幅に対する比率で表します。たとえば android:innerRadiusRatio="5" の場合、内側の半径はリングの幅を 5 で割った値と等しくなります。この値は android:innerRadius によってオーバーライドされます。デフォルト値は 9 です。
android:thickness
ディメンション。リングの太さ。ディメンション値またはディメンション リソースで指定します。
android:thicknessRatio
浮動小数点数。リングの太さを、リングの幅に対する比率で表します。たとえば android:thicknessRatio="2" の場合、太さはリングの幅を 2 で割った値と等しくなります。この値は android:innerRadius によってオーバーライドされます。デフォルト値は 3 です。
android:useLevel
ブール値。LevelListDrawable として使用する場合は true に設定します。通常これは false に設定します。設定しないとシェイプが表示されません。
<corners>
シェイプの角の丸みを作ります。シェイプが長方形の場合のみ適用されます。

属性:

android:radius
ディメンション。すべての角の半径。ディメンション値またはディメンション リソースで指定します。この値は各角に対応する次の属性によってオーバーライドされます。
android:topLeftRadius
ディメンション。左上の角の半径。ディメンション値またはディメンション リソースで指定します。
android:topRightRadius
ディメンション。右上の角の半径。ディメンション値またはディメンション リソースで指定します。
android:bottomLeftRadius
ディメンション。左下の角の半径。ディメンション値またはディメンション リソースで指定します。
android:bottomRightRadius
ディメンション。右下の角の半径。ディメンション値またはディメンション リソースで指定します。

注: 最初はすべての角の丸みを 1 より大きく指定する必要があります。そうしないと角が丸くなりません。特定の角を丸めない場合は、回避策として、android:radius を使用してデフォルトの角の丸みを 1 より大きい値に設定してから、それぞれの角に特定の値を指定します。角を丸くしない場合はゼロ(「0dp」)を指定します。

<gradient>
シェイプのグラデーション カラーを指定します。

属性:

android:angle
整数。グラデーションの角度。0 は左から右、90 は下から上です。45 の倍数にする必要があります。デフォルト値は 0 です。
android:centerX
浮動小数点数。グラデーションの中心の相対 X 位置(0~1.0)。
android:centerY
浮動小数点数。グラデーションの中心の相対 Y 位置(0~1.0)。
android:centerColor
色。開始色と終了色の間にある任意の色。16 進数値またはカラーリソースで指定します。
android:endColor
色。終了色。16 進数値またはカラーリソースで指定します。
android:gradientRadius
浮動小数点数。グラデーションの半径。android:type="radial" の場合のみ適用されます。
android:startColor
色。開始色。16 進数値またはカラーリソースで指定します。
android:type
キーワード。適用するグラデーション パターンの種類。有効な値は次のとおりです。
説明
"linear" 線形グラデーション。これがデフォルトです。
"radial" 放射状のグラデーション。開始色は中心の色です。
"sweep" 傾斜線のグラデーション。
android:useLevel
ブール値。LevelListDrawable として使用する場合は true に設定します。
<padding>
ビュー要素に適用するパディング。シェイプではなく、ビューのコンテンツの位置にパディングを設定します。

属性:

android:left
ディメンション。左のパディング。ディメンション値またはディメンション リソースで指定します。
android:top
ディメンション。上部のパディング。ディメンション値またはディメンション リソースで指定します。
android:right
ディメンション。右のパディング。ディメンション値またはディメンション リソースで指定します。
android:bottom
ディメンション。下部のパディング。ディメンション値またはディメンション リソースで指定します。
<size>
シェイプのサイズ。

属性:

android:height
ディメンション。シェイプの高さ。ディメンション値またはディメンション リソースで指定します。
android:width
ディメンション。シェイプの幅。ディメンション値またはディメンション リソースで指定します。

注: デフォルトでは、シェイプはここで定義したディメンションに比例して、コンテナのビューのサイズに合わせてスケーリングされます。このシェイプを ImageView で使用する場合は、android:scaleType"center" に設定することでスケーリングを制限できます。

<solid>
シェイプの塗りつぶしに使用する単色。

属性:

android:color
色。シェイプに適用する色。16 進数値またはカラーリソースで指定します。
<stroke>
シェイプのストローク線。

属性:

android:width
ディメンション。線の太さ。ディメンション値またはディメンション リソースで指定します。
android:color
色。線の色。16 進数値またはカラーリソースで指定します。
android:dashGap
ディメンション。点線の点の間隔。ディメンション値またはディメンション リソースで指定します。android:dashWidth が設定されている場合のみ有効です。
android:dashWidth
ディメンション。各点線のサイズ。ディメンション値またはディメンション リソースで指定します。android:dashGap が設定されている場合のみ有効です。
例:
res/drawable/gradient_box.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

次のレイアウト XML は、ビューにシェイプ ドローアブルを適用しています。

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

次のアプリケーション コードは、シェイプ ドローアブルを取得してビューに適用します。

Kotlin

val shape: Drawable? = getDrawable(resources, R.drawable.gradient_box, getTheme())

val tv: TextView = findViewById(R.id.textview)
tv.background = shape

Java

Resources res = getResources();
Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme());

TextView tv = (TextView)findViewById(R.id.textview);
tv.setBackground(shape);
関連項目: