本文已参与「新人创作礼」活动,一起开启掘金创作之路。
兼容Java¶
Coil的API是设计成Kotlin优先的. Coil充分利用了Kotlin的语言特性, 如内联lambda, 接收器参数, 默认参数, 以及扩展函数, 而这些在Java中是不可用的.
重要的是, Java不能实现挂起函数. 这意味着自定义Transformation, Size Resolver, Fetcher, 和Decoders 必须在Kotlin中实现.
尽管有这些限制, 大多数的Coil API是兼容Java的. 扩展函数Context.imageLoader不能从Java中使用. 可是, 可以使用单例ImageLoader:
ImageLoader imageLoader = Coil.imageLoader(context)
ImageRequest入队的语法在Java和Kotlin中几乎一样:
ImageRequest request = new ImageRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.crossfade(true)
.target(imageView)
.build();
imageLoader.enqueue(request)
注意
ImageView.load不能在Java中使用. 需使用ImageRequest.Builder API.
suspend函数不能在Java中轻易调用. 由此, 要想异步加载图片, 必须要使用ImageLoader.executeBlocking扩展函数, 它在Java中的调用类似于下面的例子:
ImageRequest request = new ImageRequest.Builder(context)
.data("https://www.example.com/image.jpg")
.size(1080, 1920)
.build();
Drawable drawable = ImageLoaders.executeBlocking(imageLoader, request).getDrawable();
注意
ImageLoaders.executeBlocking将会阻塞而非挂起当前线程. 因而不要在主线程中调用这个函数.
Gif¶
不像Glide, Coil默认不支持GIF. 可是Coil有扩展库支持加载GIF.
要添加GIF支持, 导入扩展库:
implementation("io.coil-kt:coil-gif:2.2.0")
而且要在构建ImageLoader的时候将解码器添加进组件注册器:
val imageLoader = ImageLoader.Builder(context)
.components {
if (SDK_INT >= 28) {
add(ImageDecoderDecoder.Factory())
} else {
add(GifDecoder.Factory())
}
}
.build()
ImageLoader会使用文件头来自动侦测GIF并且正确地解码.
注意
Coil引入了2个独立的解码器以支持解码GIF. GifDecoder支持全部API版本, 但是慢. ImageDecoderDecoder基于ImageDecoder实现, 却只支持API 28及以上. ImageDecoderDecoder要比GifDecoder快而且支持解码动画WebP图片和动画HEIF图片序列.