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

标签 android android-glide

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

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

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

最佳答案

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

Glide 的代码和示例提供了两个示例来说明其工作原理。对于自定义资源类型,请查看 SVG sample 。对于自定义模型类型和自定义解码器,请查看用于解码的代码 Gif frames 。根据您的描述,听起来 Gif 帧示例可能更相关。

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

  1. 首先您需要定义 ModelLoader 。传统上,模型加载器用于检索数据。如果没有必要(即您可以仅根据标识符解码位图),您可以按照上面的 Gif 帧示例并简单地传递您的标识符。

  2. 其次,您需要定义 ResourceDecoder 。您的 ResourceDecoder 将获取标识符,检查数据存储,生成位图,然后返回新的 BitmapResource .

由于您正在解码 Glide 知道的资源类型,因此您可以传入 Glide 的 BitmapEncoderStreamBitmapDecoder如果你想支持磁盘缓存,Glide 的 BitmapTransformations 中的任何一个如果你想应用转换,最后你可以使用 Glide 的 BitmapImageViewTarget指定如何将位图加载到 View 中。

整个加载调用将如下所示:

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,从而帮助减轻一些样板代码。

关于android - 使用 Glide 使用生成器生成位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199225/

相关文章:

android - 我可以使用 Glide 来缓存图像而不显示它们吗

android - 使用 "key-value"格式的 multipart 将图像上传到服务器

Android Activity 生命周期 - 相同的方法被调用两次

android - 如何在给定时间运行作业服务

android - 按下后退时强制 EditText 失去焦点

android - 闪屏出现滑动问题,因为它不工作

android - 如何在将图像上传到 firebase 存储之前减小图像的大小?

android - 如何使用 Glide 获取流视频链接的帧

java - 在一项 Activity 中使用 volley 进行两次 API 调用......好的做法?

android - 有什么办法可以阻止 android 中键盘出现的标签吗?