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