オープンソースのKotlin初のAndroid用画像読み込みライブラリであるCoilを発表できることを嬉しく思います。Coilは高速、軽量、モダンで、Kotlin Coroutines、OkHttp、Okio、AndroidXライフサイクルを第1級市民として扱います。 CoilはCoroutine Image Loaderの頭字語です。

何億ものカタログリストを使って、Instacartに多くの画像を読み込みます。 Androidチームでは、画像読み込みライブラリの選択は、アプリの最も重要な部分の1つです。

Coilのコードは次をご覧ください:

// To load an image into an ImageView, use the load extension function.
imageView.load("https://www.example.com/image.jpg")

// Coil supports urls, uris, resources, drawables, bitmaps, files, and more.
imageView.load(R.drawable.image)
imageView.load(File("/path/to/image.jpg"))
imageView.load(Uri.parse("content://com.android.externalstorage/image.jpg"))

// Requests can be configured with an optional trailing lambda.
imageView.load("https://www.example.com/image.jpg") {
    crossfade(true)
    placeholder(R.drawable.image)
    transformations(CircleCropTransformation())
}

// Custom targets can be created using lambda syntax (onStart and onError are optional).
Coil.load(context, "https://www.example.com/image.jpg") {
    target { drawable ->
        // Handle the successful result.
    }
}

// To get an image imperatively, use the get suspend function.
val drawable = Coil.get("https://www.example.com/image.jpg")

別の画像読み込みライブラリ?

今日、Android開発者向けの画像読み込みライブラリオプションは、いくつかありますが、よりモダンでシンプルな製品を作る機会があると感じました。 Coilは次の目的で作成されました。

  • 拡張機能、インライン化(inlining)、ラムダパラメーター(lambda params)、シールドクラス(sealed classes)などのKotlin言語機能を活用して、シンプルでエレガントなAPIを作成します
  • スレッドの再利用を最大化しながら、ノンブロッキング非同期計算と作業キャンセルを強力にサポートするKotlin Coroutinesを活用します
  • 最新の依存関係を利用します。 SquareのOkHttpとOkioは、すべてのAndroidアプリとしての標準的な依存関係です。これらはデフォルトで効率的であり、Coilはディスクキャッシングとストリームバッファリングの再実装を回避できます。 同じように、AndroidXライフサイクルは現在、ライフサイクル状態を追跡するための推奨される方法です。 Coilは、それらをサポートする唯一の画像読み込みライブラリです。
  • 軽量化: Coilのコード行はGlideよりほぼ8倍少なく、Picassoよりもわずかに少ないです。また、CoilはAPKに〜1500個のメソッドを追加します(既にOkHttpとCoroutinesを使用しているアプリの場合)。これはPicassoに匹敵し、GlideやFrescoよりも大幅に少ないです。
  • 拡張機能をサポートします。 Coilの画像パイプラインは、マッパー (Mappers)、フェッチャー (Fetchers)、デコーダー (Decoders)の3つの主要なクラスで構成されています。 これらのインターフェイスを使って、基本動作を拡張および/またはオーバーライドし、Coilで新しいファイルタイプのサポートを追加できます。
  • テストを改善します。 CoilのメインサービスクラスであるImageLoaderはインターフェースです。 これにより、テスト用の偽のImageLoader実装を作成できます。 Coilは、シングルトン (Singleton)および非シングルトン(non-sigleton)のアーティファクトを提供するため、依存性注入もサポートしています。
  • 多くの場合、注釈処理を避けるとビルドスピードを低下させる可能性があります。Coilは代わりにKotlin拡張機能に依存しています。

Coilが他の画像ローダーでサポートされている既存の機能を確実にカバーできるように努力しましたが、次のような独自の機能も追加したいことも考えました。

動的画像サンプリング

リスト画像は意図的に低解像度でロードされており、クロスフェードの速度が遅くなって効果が強調されています。

ディスク上に500×500のイメージがあり、100×100のImageViewにロードされているとします。 Coilは100×100で画像をメモリにロードします。

ただし、500×500の画像が必要な場合はどうなりますか? ディスクから読み取る「品質」はまだありますが、画像は既に100×100でメモリに読み込まれています。 理想的には、100×100の画像をプレースホルダーとして使用し、500×500でディスクから画像を読み取ります。

これはまさにCoilが行うことであり、CoilはallBitmapDrawables(およびすぐにすべてのDrawables)に対してこのプロセスを自動的に処理します。 クロスフェードアニメーションと組み合わせると、プログレッシブJPEGのように、画像のディテールがフェードインするように見える快適な視覚効果を作成できます。 プレースホルダーもメインスレッドに同期的に設定され、白いフラッシュを防ぐために、ImageViewが一つのフレームで空になっています。

入門

私たちはCoilを皆さんと共有できることを非常に嬉しく思います。この投稿に掲載きれなかったことについては、後ほど説明がありますので、是非ドキュメントGithubリポジトリをご覧ください。 また、Twitterで連絡もできます。

今はInstacartでCoilを使っています。ライブラリも試してみることをお勧めします。

また、まもなくベンチマークリポジトリをリリースし、Coilのランタイムパフォーマンス(runtime performance)を他の画像読み込みライブラリと比べます。


Coilのようなプロジェクトに興味がありますか? Instacartは今募集しています!是非私たちの求人情報をチェックしてみてください。

原文タイトル:Introducing Coil: Kotlin-first image loading on Android

原文作者:Colin White

原文リンク:https://tech.instacart.com/introducing-coil-kotlin-first-image-loading-on-android-f0fdc7a2a99e

今すぐシェアしよう!
今すぐシェアしよう!