Picassoで取得した画像をDarwableとして扱う

Androidで画像のURLをImageViewにセットする場合、PicassoやGlide等のライブラリを使うのが一般的だと思います。
しかし、何らかの理由でImageViewを参照できなかった場合どうすれば良いでしょうか。
今回は、ImageViewの参照が限定的な時にPicassoのライブラリを使って画像をセットするやり方について書きます。

問題

任意の画像URLから画像をダウンロードしてToolbarのロゴにセットしたかったのですが、
Toolbarのロゴ(ImageView)は外部に公開されておらずDrawableをセットするメソッドがあるだけした。
ImageViewが参照できないと詰みでは?と思ってたのですがドキュメントを眺めたらTargetというクラスがこの問題を解決してくれそうだったので試してみました。

解決策

コードは下記になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
val target = object : Target {
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
binding.toobar.logo = bitmap?.toDrawable(resources)
}

override fun onBitmapFailed(errorDrawable: Drawable?) {
binding.toobar.logo = errorDrawable
}

override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
binding.toobar.logo = placeHolderDrawable
}
}

Picasso.with(this)
.load(url)
.into(target)

Targetの使い方はImageView同様、into()メソッドのパラメータにセットするだけです。
そうすることで、プレースホルダー画像・エラー画像・URLから取得した画像のDrawableをコールバックで受け取ることができます。

感想

普段自分は問題にぶつかった時、自分が思いつく解決策を実現してくれるコードがライブラリにあるかという観点でコードを読んでいます。
が、square製ライブラリの場合は、そもそも自分が思いもしなかったスマートな解決が提供されてる場合がありドキュメントをしっかり読むことの重要性を再確認しました。