Java 使用Glide加载SVG时,图像变得模糊

Java 使用Glide加载SVG时,图像变得模糊,java,android,svg,android-glide,Java,Android,Svg,Android Glide,在应用程序中,我使用以下示例将SVG图像加载到ImageView中: Glide.with(context) .using(Glide.buildStreamModelLoader(Uri.class, context), InputStream.class) .from(Uri.class) .as(SVG.class) .transcode(new SvgDrawa

在应用程序中,我使用以下示例将SVG图像加载到ImageView中:

Glide.with(context)
                .using(Glide.buildStreamModelLoader(Uri.class, context), 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())
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .load(uri)
                .into(imageView);
Glide.with(上下文)
.using(Glide.buildStreamModelLoader(Uri.class,context),InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(新的svgdrawableTrancoder(),PictureDrawable.class)
.sourceEncoder(新的StreamEncoder())
.cacheDecoder(新文件ToStreamDecoder(新SvgDecoder()))
.decoder(新的SvgDecoder())
.listener(新的SvgSoftwareLayerSetter())
.diskCacheStrategy(diskCacheStrategy.NONE)
.load(uri)
.进入(图像视图);
xml格式的ImageView如下所示:

       <ImageView
        android:layout_width="46dp"
        android:layout_height="46dp"
        android:layout_marginTop="25dp"
        android:layout_gravity="center"
       />

因此,问题可以在下图中看到。右边的图标是从应用程序的资源中设置的,而左边的图标是使用Glide从服务器中加载的。由于某些原因,图像缩放不正确,看起来模糊

我已经尝试过这个答案的解决方案:
,但它不起作用。

升级到glide v4后,问题消失了。现在,我使用以下代码加载svg:

      GlideApp.with(context)
            .as(PictureDrawable.class)
            .transition(withCrossFade())
            .fitCenter()
            .listener(new SvgSoftwareLayerSetter())
            .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.RESOURCE))
            .load(uri).into(imageView);
在我的AppGlide模块中,我有:

@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, Registry registry) {
    registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder())
            .prepend(SVG.class, new SvgEncoder())
            .append(InputStream.class, SVG.class, new SvgDecoder());
}
SVGDrawableTrancoder使用一种简单的方法将SVG转换为PictureDrawable:

public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> {

    @Override
    public Resource<PictureDrawable> transcode(@NonNull Resource<SVG> toTranscode, @NonNull Options options) {
        SVG svg = toTranscode.get();
        Picture picture = svg.renderToPicture();
        PictureDrawable drawable = new PictureDrawable(picture);
        return new SimpleResource<>(drawable);
    }
}
公共类svgdrawableTrancoder实现ResourceTranscoder{
@凌驾
公共资源转码(@NonNull Resource-toTranscode,@NonNull-Options){
SVG SVG=toTranscode.get();
Picture Picture=svg.renderToPicture();
PicturedRavable drawable=新的PicturedRavable(图片);
返回新的SimpleResource(可提取);
}
}
这就是我实现SvgEncoder类的方式:

public class SvgEncoder implements ResourceEncoder<SVG>{
    @NonNull
    @Override
    public EncodeStrategy getEncodeStrategy(@NonNull Options options) {
        return EncodeStrategy.SOURCE;
    }

    @Override
    public boolean encode(@NonNull Resource<SVG> data, @NonNull File file, @NonNull Options options) {
        try {
            SVG svg = data.get();
            Picture picture = svg.renderToPicture();
            picture.writeToStream(new FileOutputStream(file));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
公共类SvgEncoder实现ResourceEncoder{
@非空
@凌驾
public EncodeStrategy getEncodeStrategy(@NonNull选项){
返回编码策略.SOURCE;
}
@凌驾
公共布尔编码(@NonNull资源数据、@NonNull文件文件、@NonNull选项){
试一试{
SVG SVG=data.get();
Picture Picture=svg.renderToPicture();
picture.writeToStream(新文件输出流(文件));
返回true;
}捕获(例外e){
e、 printStackTrace();
返回false;
}
}
}
对于Android s,令人惊讶的是,以下几点对我有效(请参阅):


尝试
Drawable d=imageView.getDrawable()
并使用
Log.d
转储
d.getClass()
d.getIntrinsicWidth()
d.getIntrinsicHeight()
,现在您在logcat上看到了什么?左边的是:d.getIntrinsicWidth()=46,d.getrinsicHeight()=46右边的是:d.getIntrinsicWidth()=69,d.getIntrinsicHeight()=69那么
d.getClass()
呢?它是不是
android.graphics.drawable.PictureDrawable
android.graphics.drawable.BitmapDrawable
?如果使用更大的
ImageView
,那么
getIntrinsicWidth
/
getIntrinsicHeight
是否也会更改?例如256px x 256 px,左边是android.graphics.drawable.PictureDrawable的实例,在我将ImageView的大小设置为56dp x 56dp后,内部宽度/高度没有改变。右边是android.support.graphics.drawable.VectorDrawableCompat,在为ImageView设置了不同的大小后,固有的宽度/高度也保持不变,但图像的缩放正确。但是在哪里可以找到SVG.class?提前感谢:)@RadoVidjen-我正在使用这个库:只需将它添加到您的依赖项中:实现'com.caverock:androidsvg:1.2.1'谢谢您的回答!我还有一个问题:
new svgdrawableTrancoder()
来自哪里?@RadoVidjen我用svgdrawableTrancoder类代码编辑了我的答案。非常感谢,你帮了我很多忙!干杯
Glide.with(context).load(myImage).dontTransform().into(myView);