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