アイコンフォントをDrawableに変換する薄いライブラリ


タイトル通りですが、iconFontをDrawableに変換する薄いライブラリを書きました。
[kazy1991/FontDrawable](https://github.com/kazy1991/FontDrawable)

### TL;DR
* 任意のアイコンフォントをDrawableもしくはBitmapに変換できる。
* 「文字コード → アイコン」のマッピング機能は提供しない。
* RatingBarなどのProgressDrawableにも対応。
* [コアの実装(FontDrawable.java)](https://github.com/kazy1991/FontDrawable/blob/master/lib/src/main/java/com/kazy/fontdrawable/FontDrawable.java)は200行以下なので、実装が簡単に把握出来る。

### 作った動機
弊社では内製の便利アイコンフォントがあるので、ほとんどのデザインはアイコンフォントで組むことが出来ます。アイコンフォントを使った開発は快適で、

* デザイナーさんの作業が減らせる。
*  "デザインパーツ待ち"の時間が0になる。
* 解像度の違いを気にする必要がない。
* アプリサイズを小さく出来る可能性がある。

など多くのメリットがあります。

一方でこんなやりとりが何回かありました。

```
デザイナーさん「このメニューのアイコンはxxx(社内製アイコンフォント)のyyyでお願いします。」
僕 「そこDrawableで指定する必要があって、アイコンフォントは(凄い頑張らないと)使えないので、面倒ですが画像用意して頂けますか?」  
```
アイコンフォントからDrawableへの変換は十分な時間があれば対応できる自信はありました。しかしサクッと実装出来るほどDrawableに詳しくなかったので諦めて画像作ってもらうことが多く、ずっとモヤモヤしていました。そして先週にも同様の出来事があったので、カッとなって週末で変換ライブラリを作りました。
(既存の「アイコンフォント → Drawable」の変換ライブラリもありますが、僕の好みに合いませんでした :crying_cat_face: )

### 使い方
経緯はそこそこにして、FontDrawableの利用手順の紹介をします。

##### Step 1. JitPackレポジトリを参照先に追加

```groovy
  repositories {
    maven {
      url "https://jitpack.io"
    }
  }
```

##### Step 2. FontDrawableを依存に追加

```groovy
  dependencies {
    compile 'com.github.kazy1991:FontDrawable:0.9.1'
  }
```
##### Step 3. 好きなアイコンフォントを `main/assets` 以下に入れる

##### Step 4.  下記のコードは [font-awsome](https://fortawesome.github.io/Font-Awesome/)を使ったサンプルです。

```java
public class MainActivity extends AppCompatActivity {

    static final String CUSTOM_FONT_PATH = "fontawesome-webfont.ttf";

    static final char SPACE_SHUTTLE_CODE = '\uf197';

    @ColorInt
    static final int MATERIAL_BLUE = 0xff00a8f7;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView drawableImageView = (ImageView) findViewById(R.id.drawable_image_view);
        FontDrawable spaceShuttle = new FontDrawable.Builder(this, SPACE_SHUTTLE_CODE, CUSTOM_FONT_PATH)
                .setSizeDp(100)
                .setColor(MATERIAL_BLUE)
                .build();
        drawableImageView.setImageDrawable(spaceShuttle);

        RatingBar ratingBar = (RatingBar) findViewById(R.id.rating_bar);
        FontProgressDrawable progressDrawable = new FontProgressDrawable.Builder(this, SPACE_SHUTTLE_CODE, CUSTOM_FONT_PATH)
                .setProgressColor(MATERIAL_BLUE)
                .setBackGroundColor(Color.LTGRAY)
                .setPaddingDp(4)
                .build();
        ratingBar.setProgressDrawable(progressDrawable);
    }
}
```

`CUSTOM_FONT_PATH`は`main/assets`からの相対パスです。文字コードの調べ方がわからない方がいると思いますが、font-awsomeの場合だと[各アイコンのパーマリンク](http://fortawesome.github.io/Font-Awesome/icon/fort-awesome/)に書いてあります。このお城のアイコンの場合、画像右下の`f286`という値ですね。
<img alt="スクリーンショット 2015-12-20 23.39.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/18261/62cc13ea-3659-c05d-7dc9-a18ed0803794.png" width=40%>

### サンプルコードのスクリーンショット

<img src="https://raw.githubusercontent.com/kazy1991/FontDrawable/image/sample_screen_shot.png" width=40% />

### ProgressDrawableにも対応
正確にはLayerDrawableですね。ちょうどRatingBarの星をアイコンフォントにして欲しいという要望があったので、ProgressDrawableにも対応しました。(実装読んでもらうとわかると思うのですが、ProgressDrawableをJavaから変更するのは結構大変でした。)

### かなり細かい点

特別なパフォーマンスチューニングはしてないですが、性能を求めるなら生成コストの高そうな[Typeface](http://developer.android.com/intl/ja/reference/android/graphics/Typeface.html)をシングルトンにして使い回し、`FontDrawable.Builder(Context context, char fontCode, Typeface typeface)`のコンストラクタを使うのが良いと思います。
Paintのプロパティを直接扱いたい場合は`FontDrawable.Builder(Context context, char fontCode, CustomFontPaint paint)`というコンストラクタがあるので、CustomFontPaintをインスタンス化してゴニョゴニョして下さい。

### おわり
[FontDrawable](https://github.com/kazy1991/FontDrawable)をもし気に入ってもらえたら、githubのほうにスターしてくれると嬉しいです :pray: 
今後もOSS活動頑張ります。