画像ライブラリGlideの使い方

## Glide

![image](https://github.com/bumptech/glide/raw/master/static/glide_logo.png)

Androidの画像ライブラリといえば[Square](http://square.github.io)の[Picasso](https://github.com/square/picasso)や[Universal Image Loader](https://github.com/nostra13/Android-Universal-Image-Loader)が有名だが，Googlerの開発している[Glide](https://github.com/bumptech/glide)というライブラリがある。リポジトリのorganizationが[bumptech](https://github.com/bumptech)となっているがこれはGoogleが買収したBumpの企業アカウントだ。

「This is not an official Google product.」と但し書きがついているが，Androidの公式Camera appや[Google IOのAndroidアプリ](https://github.com/google/iosched)にも使われている。

### Usage

#### Download

```groovy
dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.android.support:support-v4:22.2.1'
}
```

```xml
<dependency>
  <groupId>com.github.bumptech.glide</groupId>
  <artifactId>glide</artifactId>
  <version>3.6.1</version>
  <type>aar</type>
</dependency>
<dependency>
  <groupId>com.google.android</groupId>
  <artifactId>support-v4</artifactId>
  <version>r7</version>
</dependency>
```

#### 基本的な使い方

Glideは以下の様にして使う事ができる。

```java
@Override
public void onCreate(Bundle savedInstanceState) {
    ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
    Glide.with(this).load("http://goo.gl/h8qOq7").into(imageView);
}
```

Picassoと似ているので慣れている人であれば使い方はなんとなく分かるだろう。
初めての方は以下のページを参考にしてほしい。

- [画像ライブラリPicassoの使い方](http://qiita.com/hotchemi/items/33ebd5faa42d2d05c2b6)
 
GlideのTransformationsは[こちら](https://github.com/bumptech/glide/wiki/Transformations)を，Targetに関しては[こちら](https://github.com/bumptech/glide/wiki/Custom-targets)を参照してほしい。

##### 設定

Picassoと比較して嬉しい所に，Glideは細かな設定をグローバルに設定できるインタフェースがある。

```java
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        Glide.setup(new GlideBuilder(this)
            .setDiskCache(...)
            .setMemoryCache(...)
        );
    }
}
```

`GlideBuilder`クラスを利用して以下の項目の設定をする事ができる。詳しくは[こちら](https://github.com/bumptech/glide/wiki/Configuration)。

- Disk Cache
- Memory cache 
- Bitmap pools
- Bitmap Format

#### Volley連携

GlideはVolleyと連携する機能を持ちメディアの取得にVolleyを使う事ができる。
使用するには以下の様に記述する。

```groovy
dependencies {
    compile 'com.github.bumptech.glide:volley-integration:1.1.+'
    compile 'com.mcxiaoke.volley:library:1.0.+'
}
```
```xml
<dependency>
    <groupId>com.github.bumptech.glide</groupId>
    <artifactId>volley-integration</artifactId>
    <version>1.1.0</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>com.mcxiaoke.volley</groupId>
    <artifactId>library</artifactId>
    <version>1.0.5</version>
    <type>aar</type>
</dependency>
```

ApplicationかActivityで以下のメソッドを呼び出す。

```java
public void onCreate() {
  Glide.get(this).register(GlideUrl.class, InputStream.class,
        new VolleyUrlLoader.Factory(yourRequestQueue));
}
```

#### OkHttp連携

Volleyに加え，GlideはOkHttpとの連携もサポートしている。

```groovy
dependencies {
    compile 'com.github.bumptech.glide:okhttp-integration:1.1.+'
    compile 'com.squareup.okhttp:okhttp:2.0.+'
}
```
```xml
<dependency>
    <groupId>com.github.bumptech.glide</groupId>
    <artifactId>okhttp-integration</artifactId>
    <version>1.1.0</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp</groupId>
    <artifactId>okhttp</artifactId>
    <version>2.0.0</version>
    <type>jar</type>
</dependency>
```

ApplicationかActivityで以下のメソッドを呼び出す。

```java
public void onCreate() {
  Glide.get(this).register(GlideUrl.class, InputStream.class,
        new OkHttpUrlLoader.Factory(yourOkHttpClient));
}
```

#### Picassoとの比較

インタフェースはほぼPicassoと同様(というかパクリ)なのだが，GlideはPicassoよりも高機能で以下の機能をサポートしている。

- Animated GIF support
	- Picassoではサポートしてないので地味に嬉しい。従来は自前でdecode処理を書いたりWebViewで実現していたものをGlideに置き換えられる。使い方は[サンプル](https://github.com/bumptech/glide/tree/master/samples/giphy)にもある。
- Local video support
	- ローカルにあるvideoもdecodeしてくれるらしい。
- Thumbnail support
	- サムネイルの表示機能を実装している。

```java
Glide.with(yourFragment).load(yourUrl).thumbnail(0.1f).into(yourView)
```
- Animation Support

	- Picassoでアニメーションを実装するのに困った事がある人には嬉しい機能だ。

```java
Animation anim = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
Glide.with(this).load(URL).animate(anim).into(imageView);
```

尚，英語だがこちらの[ブログ](http://vardhan-justlikethat.blogspot.jp/2014/09/android-image-loading-libraries-picasso.html)の表が非常に分かりやすい。

### まとめ

- Animated GIFやAnimationを差し込みたい場合はGlideを使ったほうが良い(GifサポートがOOM起こさないかは未検証)。
- Disk CacheやMemory Cacheの細かな設定をしたい場合はGlideの方が都合が良い。逆に言うとこだわらない場合はPicassoの方が都合が良い。
- Debug機能はPicassoの方が充実している。
- ソースコード量はGlideの方が多いので，全量を読まないと使いたくないという人はPicassoの方が良い。
- サポート体制に関してはPicassoの方が手厚く感じる。Glideは現状@samajuddという人がメインのメンテナである。

### Link

- [GitHub](https://github.com/bumptech/glide)
- [Wiki](https://github.com/bumptech/glide/wiki)
- [Javadoc](http://bumptech.github.io/glide/javadocs/latest/)
- [Google Group](https://groups.google.com/forum/#!forum/glidelibrary)