使用 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 帧示例听起来可能更相关。
假设我明白你想做什么,你需要定义并提供两个接口。
首先你需要定义一个ModelLoader。传统上,ModelLoader 用于检索数据。如果这不是必需的(即你可以单独从你的标识符解码你的位图)你可以按照上面的 Gif 帧示例并简单地传递你的标识符。
其次你需要定义一个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,从而帮助减轻一些样板文件。
我有一个不典型的 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 帧示例听起来可能更相关。
假设我明白你想做什么,你需要定义并提供两个接口。
首先你需要定义一个ModelLoader。传统上,ModelLoader 用于检索数据。如果这不是必需的(即你可以单独从你的标识符解码你的位图)你可以按照上面的 Gif 帧示例并简单地传递你的标识符。
其次你需要定义一个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,从而帮助减轻一些样板文件。