Search code examples
javaandroidsvgandroid-glide

Does Glide have a method for loading both PNG and SVG?


I'm using Glide to load some images asynchronously into some of my ImageViews, and I know it can handle images like PNG or JPG as it can handle SVG.

Thing is, As far as I know, the way I load those two kinds of image differs. Like:

Loading "normal" images

Glide.with(mContext)
                .load("URL")
                .into(cardHolder.iv_card);

Loading SVG

GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder = Glide.with(mContext)
        .using(Glide.buildStreamModelLoader(Uri.class, mContext), InputStream.class)
        .from(Uri.class)
        .as(SVG.class)
        .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
        .sourceEncoder(new StreamEncoder())
        .cacheDecoder(new FileToStreamDecoder<>(new SVGDecoder()))
        .decoder(new SVGDecoder())
        .listener(new SvgSoftwareLayerSetter<Uri>());

requestBuilder
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .load(Uri.parse("URL"))
        .into(cardHolder.iv_card);

And if I try to load SVG with the first method it won't work. If I try to load PNG or JPG with the second method, it won't work either.

Is there a generic way to load both image types using Glide?

The server where I'm fetching those images from don't tell me the image type before I download it. It's a REST server and the resource will be retrieved in a way like "http://foo.bar/resource". The only way to know the image type is reading the HEAD response.


Solution

  • You can use Glide & AndroidSVG together to achieve your goal.

    There is sample from Glide for SVG.Sample Example

    Setup RequestBuilder

    requestBuilder = Glide.with(mActivity)
        .using(Glide.buildStreamModelLoader(Uri.class, mActivity), InputStream.class)
        .from(Uri.class)
        .as(SVG.class)
        .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
        .sourceEncoder(new StreamEncoder())
        .cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
        .decoder(new SvgDecoder())
        .placeholder(R.drawable.ic_facebook)
        .error(R.drawable.ic_web)
        .animate(android.R.anim.fade_in)
        .listener(new SvgSoftwareLayerSetter<Uri>());
    

    Use RequestBuilder with uri

    Uri uri = Uri.parse("http://upload.wikimedia.org/wikipedia/commons/e/e8/Svg_example3.svg");
    requestBuilder
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        // SVG cannot be serialized so it's not worth to cache it
        .load(uri)
        .into(mImageView);
    

    This way you can achieve your goal. I hope this is helpful.