Coil - 基于Kotlin协程的Android图片加载库 - 4

561 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

ImageRequest

ImageRequest值对象, 提供了ImageLoader加载图片的全部必要信息.

ImageRequest通过使用构建者进行创建:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .crossfade(true)
    .target(imageView)
    .build()

一旦创建了请求, 要将请求传给ImageLoader进行入队/执行:

imageLoader.enqueue(request)

Target

Target接收ImageRequest的结果Drawable. 它们经常扮演了"视频适配器"的角色, 将placeholder/error/success这样的drawable应用到View里面(比如ImageViewTarget).

如下是创建自定义Target的最简单方式:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .target(
        onStart = { placeholder ->
            // Handle the placeholder drawable.
        },
        onSuccess = { result ->
            // Handle the successful result.
        },
        onError = { error ->
            // Handle the error drawable.
        }
    )
    .build()
imageLoader.enqueue(request)

Target有2种类型:

  • Target: 基础的Target类. 在图片请求没有绑定View的时候使用.
  • ViewTarget: 绑定了View的Target. 在请求在View上设置了placeholder/error/success的Drawable的时候使用. ViewTarget也将请求绑定了View的生命周期.

Transformation

Transformations允许你在Drawable从请求返回之前修改图片的像素数据.

默认情况下, Coil打包内置了2个Transformation: circle croprounded corners.

Transformation仅仅修改静态图片的像素数据. 将Transformation添加进生成动画图片的ImageRequest会将动画图片转化成静态图片, 由此Transformation才能使用. 要想转化动画图片每一帧的像素数据请查看AnimatedTransformation.

注意

如果图片管道线返回的Drawable不是BitmapDrawable, 那么Drawable将会转化成BitmapDrawable. 这将导致动画Drawable仅仅绘制了动画的首帧. 这个行为可以通过设置ImageRequest.Builder.allowConversionToBitmap(false)来进行禁止.

Transition

Transition允许在Target上设置图片请求结果的过程中执行动画.

ImageLoaderImageRequest构造器接受Transition.Factory. Transition允许你控制success/error的drawable设置在Target上的过程. 这允许你对Target的View执行动画或者封装输入的Drawable.

默认情况下, Coil打包内置了2种Transition: