coil-compose について
Jetpack Compose で Coil を使って画像を読み込むためのスキルです。Android 開発者が適切なコンポーザブルを選び、読み込み状態、サイズ、アクセシビリティ、パフォーマンスを扱う方法を示します。
主な機能
- 01AsyncImage の使用ガイド
- 02Painter とスロット API の選択
- 03読み込み・エラー状態の処理
- 04画像サイズと変換
- 05キャッシュとアクセシビリティの実践
活用シーン
- 01Compose でのリモート画像表示
- 02読み込み・エラー UI のカスタマイズ
- 03Canvas や Icon での画像読み込み
- 04リスト内の画像リクエスト調整
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ new-silvermoon/ awesome-android-agent-skills --skill coil-composeインストール後、Claude Code で/coil-composeを入力して読み込まれたか確認します。
詳細
Jetpack Compose 向け Coil
手順
Jetpack Compose で画像を読み込む場合は、Coil(Coroutines Image Loader)を使用してください。効率性とシームレスな統合により、Compose に推奨されるライブラリです。
1. 主要なコンポーザブル:AsyncImage
ほとんどのユースケースでは、AsyncImage を使用してください。サイズを自動的に解決し、標準の Image パラメーターをサポートします。
AsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.data("https://example.com/image.jpg")
.crossfade(true)
.build(),
placeholder = painterResource(R.drawable.placeholder),
error = painterResource(R.drawable.error),
contentDescription = stringResource(R.string.description),
contentScale = ContentScale.Crop,
modifier = Modifier.clip(CircleShape)
)
2. 低レベルの制御:rememberAsyncImagePainter
コンポーザブルではなく Painter が必要な場合(例:Canvas や Icon で使用する場合)、または読み込み状態を手動で監視する場合に限り、rememberAsyncImagePainter を使用してください。
警告
rememberAsyncImagePainterは、画面上で画像がどのサイズで読み込まれるかを検出せず、デフォルトでは常に元のサイズで画像を読み込みます。Painterがどうしても必要な場合を除き、AsyncImageを使用してください。
val painter = rememberAsyncImagePainter(
model = ImageRequest.Builder(LocalContext.current)
.data("https://example.com/image.jpg")
.size(Size.ORIGINAL) // Explicitly define size if needed
.build()
)
3. スロット API:SubcomposeAsyncImage
状態(読み込み中、成功、エラー)ごとにカスタムのスロット API が必要な場合は、SubcomposeAsyncImage を使用してください。
注意
サブコンポジションは通常のコンポジションより低速です。
LazyColumnやLazyRowなど、パフォーマンスが重要な箇所でのSubcomposeAsyncImageの使用は避けてください。
SubcomposeAsyncImage(
model = "https://example.com/image.jpg",
contentDescription = null,
loading = {
CircularProgressIndicator()
},
error = {
Icon(Icons.Default.Error, contentDescription = null)
}
)
4. パフォーマンスとベストプラクティス
- シングルトンの ImageLoader:ディスク/メモリーキャッシュを共有できるよう、アプリ全体で単一の
ImageLoaderインスタンスを使用してください。 - メインスレッドセーフ:Coil は画像リクエストを自動的にバックグラウンドスレッドで実行します。
- クロスフェード:プレースホルダーから成功状態への遷移を滑らかにするため、
ImageRequestで常にcrossfade(true)を有効にしてください。 - サイズ指定:必要以上に大きな画像を読み込まないよう、
contentScaleを適切に設定してください。
5. 実装チェックリスト
- 他のバリエーションより
AsyncImageを優先してください。 - 意味のある
contentDescriptionを必ず指定するか、装飾用画像の場合はnullに設定してください。 - UX を向上させるため、
crossfade(true)を使用してください。 - リスト内での
SubcomposeAsyncImageの使用は避けてください。 - 変換(例:
CircleCropTransformation)など、特定の要件に合わせてImageRequestを設定してください。