# AndroidのProgresBarに9patchを使った独自画像を設定する際のxmlの書き方

AndroidのProgressBarのデザインを変更するときに、ちょっと苦労したお話です。
こんな画像↓
![background.png](https://qiita-image-store.s3.amazonaws.com/0/7933/d4827982-8d48-b932-30b4-c6a29ed471ee.png) と
こんな画像↓
![progress.png](https://qiita-image-store.s3.amazonaws.com/0/7933/1b74838b-3330-e28c-7107-17606153a5b7.png) を組み合わせて、
こんな画像↓
![progressbar.png](https://qiita-image-store.s3.amazonaws.com/0/7933/df48f6f2-8f99-2017-b9f8-bcc17b7dc995.png) なプログレスバーを表示したいのです。

## インターネットの情報

で、インターネットを検索してヒットするのは↓だいたいこんな感じです。

```xml:my_progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
        <bitmap android:src="@drawable/background" />
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <bitmap android:src="@drawable/progress" />
        </clip>
    </item>
</layer-list>
```

layoutファイルで使うときは↓こんな感じですね。
0%、50%、100%のプログレスバーを表示しています。

```xml:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="4dp"
    tools:context=".MainActivity" >

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:progress="0"
        android:progressDrawable="@drawable/my_progress" />

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:progress="50"
        android:progressDrawable="@drawable/my_progress" />

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:progress="100"
        android:progressDrawable="@drawable/my_progress" />

</LinearLayout>
```

で、これを表示してみると、↓こんな感じ。
![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/7933/123aecc0-9409-63d0-cfa1-f48c16cbf90c.png)
はい、大変__残念__な感じです。なんでここまでひどい状態になるのか不思議なくらいです。

* 背景が横に繰り返されてしまっています。リピートの指定なんてしていないのに。
* 進捗を表す前面の水色のバーは両端が歪んでしまっています。

インターネット上で見るサンプルが問題ないように見えるのは、たまたま使用している画像が伸縮したりリピートしたりしても大丈夫な画像だからでしょうか。(それとも自分の実装に抜けがある？)

## 背景の修正

まずは背景から直していきます。
元々この背景画像を引き伸ばすのは無理があります。
引き伸ばしたら両端も文字も歪んでしまいます。
そういう時は__9patch__ですね。
背景画像を↓このように修正しました。
![background.9.png](https://qiita-image-store.s3.amazonaws.com/0/7933/d2ea6c69-7d90-5eee-f967-ada39c408d00.png)
これだけでは繰り返し表示されるのは変わりません。xmlも修正します。

```xml:my_progress.xml(抜粋)
    <item android:id="@android:id/background">
        <nine-patch android:src="@drawable/background" />
    </item>
```

`<bitmap>`タグを`<nine-patch>`タグに変えました。
この時点で以下のような状態になります。
![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/7933/74c556f3-d035-9983-0979-4c6eff8c80e6.png)
だいぶ理想に近い見た目になってきました。

## 進捗画像の修正

同じように前面の水色の画像も9patchにします。
画像は↓こんな感じ。
![progress.9.png](https://qiita-image-store.s3.amazonaws.com/0/7933/df8f6ad0-ce1b-5ece-2d5d-956f0ac74671.png)
XMLは↓こんな感じです。

```xml:my_progress.xml(抜粋)
    <item android:id="@android:id/progress">
        <clip>
            <nine-patch android:src="@drawable/progress" />
        </clip>
    </item>
```

背景のときと修正内容は変わりません。`bitmap`タグを`nine-patch`タグに変えただけです。
すると↓こうなります。
![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/7933/01a788fa-4b6f-9f22-4d68-b055737989b8.png)
完成ですヽ(´ー｀)ノ

あっさりと修正できてしまいましたが、自分がここまでたどり着くのにAndroidのProgresBarクラスのソースを読んでみたり、xmlを色々と書き換えてみたりといろいろ遠回りしました。
同じように無駄な時間を過ごす人が出ないようにと祈りをこめて記事にしました。

最後にXMLの全文を載せておきます。

```xml:my_progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
        <nine-patch android:src="@drawable/background" />
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <nine-patch android:src="@drawable/progress" />
        </clip>
    </item>
</layer-list>
```