Squareが開発している画像ライブラリのPicassoは今や有名ですが,次期リリースに乗る予定の新機能について,Lucas Rochaがブログを書いていたので要約しました。
これらの機能は全てmasterにマージされているので2.4でのリリースが濃厚です。
Request Handlers
Picassoは、単純なリソースからコンテントプロバイダ、ネットワークなど,多くの画像の読み込みをサポートしています。しかし、時にはデフォルトでサポートされていない方法で画像を読み込みたい時もあります。
そういった用途の為にRequest Handlersという機能が追加されました。RequestHanlderを継承して2つのメソッドをオーバーライドします。
public class PonyRequestHandler extends RequestHandler {
private static final String PONY_SCHEME = "pony";
@Override public boolean canHandleRequest(Request data) {
return PONY_SCHEME.equals(data.uri.getScheme());
}
@Override public Result load(Request data) {
return new Result(somePonyBitmap, MEMORY);
}
}
実装したクラスをPicassoの初期化時に渡します。
Picasso picasso = new Picasso.Builder(context)
.addRequestHandler(new PonyHandler())
.build();
すると,以下の様なカスタムスキーマの画像を読み込む事が可能になります。
picasso.load("pony://somePonyName")
.into(someImageView)
必要であればビルトインのRequestHandlerを書き換える事も可能になるようです。
Request Management
Picassoはビューリサイクリングを扱っていますが,非効率な方法です。
例えば,ListViewを勢い良く操作した場合,ユーザーのインタラクションに合わせてリクエストを停止/再開する方法がないので,Picassoはリクエストの発火とキャンセルをそのままにします。
新しいRequest Management APIはタグを用いてリクエストを管理する事を可能にします。特定のタグに関連付けられたリクエストの停止/再開をする事ができるようになります。
Picasso.with(context)
.load("http://example.com/image.jpg")
.tag(someTag)
.into(someImageView)
これによってタグに関連付いた(ListViewのscroll状態など)リクエストの停止/再開が可能になります。例えば,Picassoのサンプルアプリは以下の様なスクロールリスナーを持つようになりました。
public class SampleScrollListener implements AbsListView.OnScrollListener {
...
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Picasso picasso = Picasso.with(context);
if (scrollState == SCROLL_STATE_IDLE ||
scrollState == SCROLL_STATE_TOUCH_SCROLL) {
picasso.resumeTag(someTag);
} else {
picasso.pauseTag(someTag);
}
}
...
}
Request Management APIは画像のリクエストに関して素晴らしい制御を提供します。スクロールリスナーは極々標準的な使い方の1つに過ぎません。
Request Priorities
UIで画像毎に優先度を付けたいというのはよくあるケースだと思います。例えば,同じ画面内の他のセカンダリ·イメージに関連した,大きなヒーローの画像に高い優先順位を与えたいとか!
これまでは画像間の相対的な優先度についてPicassoに通知する方法はありませんでした。が,priority APIは、リクエストの優先度についてPicassoへの通知を可能にします。
Picasso.with(context)
.load("http://example.com/image.jpg")
.priority(HIGH)
.into(someImageView);
priorityは特定の順序を保証するものではありません,優先度の高いリクエストの方にバランスを傾けるだけです。
これらの新機能を利用したい場合は,GitHubから最新のコードを取得してください。