LoginSignup
31

More than 5 years have passed since last update.

New Features in Picasso

Last updated at Posted at 2014-09-24

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から最新のコードを取得してください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31