使用 Glide 使用生成器生成位图

Using Glide to generate a bitmap using a generator

我有一个不典型的 Glide(Android 的图像缓存库)用例 - 对于 ListView 中的每个项目,如果它被缓存,我需要显示缩略图- 如果没有,我需要使用自定义 Bitmap 渲染器生成一个(而不是下载一个)。

查看文档,我看到很多关于解码和转码的讨论,但我的用例并不属于这两者。我需要 Glide 将标识符传递给渲染器——渲染器将检查数据存储并根据需要生成 Bitmap。没有流可言。

我正在寻找有关如何实现这一点的示例。

你想做的是可能的,尽管支持自定义解码器并不是 Glide 3.0 的一个巨大目标(它将是 4.0),所以这个过程有点笨拙。

Glide 的代码和示例提供了两个示例来说明其工作原理。对于自定义资源类型,请查看 SVG sample. For a custom model type and a custom decoder, take a look at the code used to decode Gif frames。根据您的描述,Gif 帧示例听起来可能更相关。

假设我明白你想做什么,你需要定义并提供两个接口。

  1. 首先你需要定义一个ModelLoader。传统上,ModelLoader 用于检索数据。如果这不是必需的(即你可以单独从你的标识符解码你的位图)你可以按照上面的 Gif 帧示例并简单地传递你的标识符。

  2. 其次你需要定义一个ResourceDecoder. Your ResourceDecoder will take the identifier, check the data store, generate a Bitmap, and then return a new BitmapResource.

由于您正在解码 Glide 知道的资源类型,因此您可以传入 Glide 的 BitmapEncoder and StreamBitmapDecoder if you want to support disk caching, any one of Glide's BitmapTransformations if you wan to apply a transformation, and finally you can use Glide's BitmapImageViewTarget 来指定如何将 Bitmap 加载到视图中。

整个加载调用如下所示:

Glide.with(fragment)
    .using(new YourModelLoader(), YourIdentifier.class)
    .load(yourIdentifier)
    .as(Bitmap.class)
    .decoder(new YourBitmapDecoder())
    .cacheDecoder(new FileToStreamDecoder(new StreamBitmapDecoder())
    .encoder(new BitmapEncoder())
    .transform(new CenterCrop())
    .into(new BitmapImageViewTarget(yourView);

由于要指定的内容很多,您还可以定义构建器一次,然后重新使用它来加载多个标识符:

builder = Glide.with(fragment)
    .using(new YourModelLoader(), YourIdentifier.class)
    .as(Bitmap.class)
    .decoder(new YourBitmapDecoder())
    .cacheDecoder(new FileToStreamDecoder(new StreamBitmapDecoder())
    .encoder(new BitmapEncoder())
    .transform(new CenterCrop());

// At some point later:
builder
    .load(firstIdentifier)
    .into(new BitmapImageViewTarget(firstView));
builder
    .load(secondIdentifier)
    .into(new BitmapImageViewTarget(secondView));

Glide 4.0 将允许您注册新组件并使用现有构建器,而不是强迫您单独提供每个部分并仅使用 GenericRequestBuilder,从而帮助减轻一些样板文件。