我有一个不典型的 Glide(Android 的图像缓存库)用例 - 对于 a 中的每个项目,ListView如果它被缓存,我需要显示一个缩略图 - 如果没有,我需要生成一个(而不是下载一)使用自定义Bitmap渲染器。
查看文档,我看到了很多关于解码和转码的讨论,但我的用例并不真正属于这两者。我需要 Glide 将标识符传递给渲染器 - 渲染器将检查数据存储并Bitmap根据需要生成一个。没有流可言。
我正在寻找一个关于如何实现这一点的例子。
我有一个不典型的 Glide(Android 的图像缓存库)用例 - 对于 a 中的每个项目,ListView如果它被缓存,我需要显示一个缩略图 - 如果没有,我需要生成一个(而不是下载一)使用自定义Bitmap渲染器。
查看文档,我看到了很多关于解码和转码的讨论,但我的用例并不真正属于这两者。我需要 Glide 将标识符传递给渲染器 - 渲染器将检查数据存储并Bitmap根据需要生成一个。没有流可言。
我正在寻找一个关于如何实现这一点的例子。
你想做的事情是可能的,虽然支持自定义解码器并不是 Glide 3.0 的一个大目标(它将是 4.0),所以这个过程有点笨拙。
Glide 的代码和示例提供了两个例子来说明它是如何工作的。对于自定义资源类型,请查看SVG 示例。对于自定义模型类型和自定义解码器,请查看用于解码Gif 帧的代码。根据您的描述,听起来 Gif 框架示例可能更相关。
假设我了解您想要做什么,您需要定义并提供两个接口。
首先,您需要定义一个ModelLoader。传统上,ModelLoader 用于检索数据。如果这不是必需的(即您可以仅从您的标识符解码您的位图),您可以按照上面的 Gif 框架示例并简单地传递您的标识符。
其次,您需要定义一个ResourceDecoder。您的 ResourceDecoder 将获取标识符、检查数据存储、生成位图,然后返回一个新的BitmapResource。
由于您正在解码 Glide 知道的资源类型,因此如果要支持磁盘缓存,则可以传入 Glide 的BitmapEncoder和StreamBitmapDecoder ,如果要应用转换,则可以传入 Glide 的BitmapTransformations,最后可以使用 Glide 的BitmapImageViewTarget指定如何将位图加载到视图中。
整个加载调用将如下所示:
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。