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

时间:2015-01-28 18:02:27

标签: android android-glide

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

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

我正在寻找一个如何实现这一目标的例子。

1 个答案:

答案 0 :(得分:3)

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

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

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

  1. 首先,您需要定义ModelLoader。传统上,ModelLoader用于检索数据。如果没有必要(例如,您可以仅从您的标识符解码您的位图),您可以按照上面的Gif框架示例操作,只需通过您的标识符。

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

  3. 由于您正在解码Glide所知道的资源类型,因此如果您想支持磁盘缓存,则可以传入Glide的BitmapEncoderStreamBitmapDecoder,其中任何一个如果您想要应用转换,请滑行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,从而有助于减轻某些样板。