Skip to content

はじめに

Compose UI

一般的なCompose UIプロジェクトでは、以下をインポートします:

kotlin
implementation("io.coil-kt.coil3:coil-compose:3.4.0")
implementation("io.coil-kt.coil3:coil-network-okhttp:3.4.0")

これらをインポートすると、AsyncImageを使用してネットワークから画像を読み込むことができます:

kotlin
AsyncImage(
    model = "https://example.com/image.jpg",
    contentDescription = null,
)

::: Note Compose Multiplatformを使用している場合は、OkHttpの代わりにKtorを使用する必要があります。その方法については、こちらを参照してください。

:::

Android View

Compose UIの代わりにAndroid Viewを使用する場合は、以下をインポートします:

kotlin
implementation("io.coil-kt.coil3:coil:3.4.0")
implementation("io.coil-kt.coil3:coil-network-okhttp:3.4.0")

これらをインポートすると、ImageView.load拡張関数を使用してネットワークから画像を読み込むことができます:

kotlin
imageView.load("https://example.com/image.jpg")

シングルトン ImageLoader の設定

デフォルトでは、CoilにはシングルトンのImageLoaderが含まれています。ImageLoaderは、フェッチ、デコード、キャッシュ、および結果の返却を行うことで、入力されたImageRequestを実行します。ImageLoaderを設定する必要はありません。設定しない場合、Coilはデフォルト設定でシングルトンのImageLoaderを作成します。

いくつかの方法で設定できます(1つだけ選択してください):

  • アプリのエントリポイント(アプリのルート@Composable)付近でsetSingletonImageLoaderFactoryを呼び出します。これはCompose Multiplatformアプリに最適です。
kotlin
setSingletonImageLoaderFactory { context ->
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}
  • AndroidのApplicationSingletonImageLoader.Factoryを実装します。これはAndroidアプリに最適です。
kotlin
class CustomApplication : Application(), SingletonImageLoader.Factory {
    override fun newImageLoader(context: Context): ImageLoader {
        return ImageLoader.Builder(context)
            .crossfade(true)
            .build()
    }
}
  • アプリのエントリポイント(AndroidのApplication.onCreateなど)付近でSingletonImageLoader.setSafeを呼び出します。これが最も柔軟な方法です。
kotlin
SingletonImageLoader.setSafe { context ->
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

::: Note Coilに依存するライブラリを作成している場合は、シングルトンのImageLoaderを取得または設定すべきではありません。代わりに、io.coil-kt.coil3:coil-coreに依存させ、独自のImageLoaderを作成して手動で受け渡しを行う必要があります。ライブラリ内でシングルトンのImageLoaderを設定すると、そのライブラリを使用するアプリ側でもCoilを使用している場合、アプリ側で設定されたImageLoaderを上書きしてしまう可能性があります。

:::

画像

マルチプラットフォームのレンダリングをサポートするため、Coil 3.xではカスタムのcoil3.Imageクラスを使用します。これはAndroidのDrawableを置き換えるものですが、完全に相互運用可能です:

kotlin
val drawable = image.asDrawable(resources)
val image = drawable.asImage()

また、Coilはcoil3.Bitmapクラスも定義しています。これは、Androidではandroid.graphics.Bitmapの、非Androidプラットフォームではorg.jetbrains.skia.Bitmapの型エイリアス(type alias)です:

kotlin
val bitmap = image.toBitmap()
val image = bitmap.asImage()

Compose UIのPainterクラスとも相互運用可能です。この拡張関数を使用するには、coil-compose-coreアーティファクトをインポートする必要があります:

kotlin
val painter = image.asPainter()

::: Note PainterImageに変換することはできません。これは、Painterはコンポジション(composition)内でのみレンダリング可能であるのに対し、Imageは任意のCanvasでレンダリング可能である必要があるためです。

:::

アーティファクト

CoilがmavenCentral()に公開している主なアーティファクトの一覧です:

  • io.coil-kt.coil3:coil: io.coil-kt.coil3:coil-coreに依存するデフォルトのアーティファクトです。シングルトンのImageLoaderと関連する拡張関数が含まれています。
  • io.coil-kt.coil3:coil-core: シングルトンのImageLoaderおよび関連する拡張関数を含まないio.coil-kt.coil3:coilのサブセットです。
  • io.coil-kt.coil3:coil-compose: デフォルトのCompose UIアーティファクトで、io.coil-kt.coil3:coilおよびio.coil-kt.coil3:coil-compose-coreに依存します。シングルトンのImageLoaderを使用するAsyncImagerememberAsyncImagePainter、およびSubcomposeAsyncImageのオーバーロードが含まれています。
  • io.coil-kt.coil3:coil-compose-core: シングルトンのImageLoaderに依存する関数を含まない、io.coil-kt.coil3:coil-composeのサブセットです。
  • io.coil-kt.coil3:coil-network-okhttp: OkHttpを使用してネットワークから画像をフェッチするサポートが含まれています。
  • io.coil-kt.coil3:coil-network-ktor2: Ktor 2を使用してネットワークから画像をフェッチするサポートが含まれています。
  • io.coil-kt.coil3:coil-network-ktor3: Ktor 3を使用してネットワークから画像をフェッチするサポートが含まれています。
  • io.coil-kt.coil3:coil-network-cache-control: ネットワークから画像をフェッチする際に、Cache-Controlヘッダーを尊重するサポートが含まれています。
  • io.coil-kt.coil3:coil-gif: GIFのデコードをサポートする2つのデコーダーが含まれています。詳細はGIFを参照してください。
  • io.coil-kt.coil3:coil-svg: SVGのデコードをサポートするデコーダーが含まれています。詳細はSVGを参照してください。
  • io.coil-kt.coil3:coil-video: Androidがサポートするすべてのビデオフォーマットのフレームのデコードをサポートするデコーダーが含まれています。詳細はビデオを参照してください。
  • io.coil-kt.coil3:coil-test: テストをサポートするクラスが含まれています。詳細はテストを参照してください。
  • io.coil-kt.coil3:coil-bom: BOM(Bill of Materials)が含まれています。coil-bomをインポートすることで、バージョンを指定せずに他のCoilアーティファクトに依存できるようになります。