用Glide加载SVG时图像模糊

anr*_*nro 3 java svg android android-glide

在应用程序中,我使用以下示例将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);
Run Code Online (Sandbox Code Playgroud)

xml中的ImageView看起来像这样:

       <ImageView
        android:layout_width="46dp"
        android:layout_height="46dp"
        android:layout_marginTop="25dp"
        android:layout_gravity="center"
       />
Run Code Online (Sandbox Code Playgroud)

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

要比较的图像

我已经尝试过以下答案的解决方案: 用Glide加载SVG时,图像尺寸太小,但是不起作用。

anr*_*nro 5

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

      GlideApp.with(context)
            .as(PictureDrawable.class)
            .transition(withCrossFade())
            .fitCenter()
            .listener(new SvgSoftwareLayerSetter())
            .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.RESOURCE))
            .load(uri).into(imageView);
Run Code Online (Sandbox Code Playgroud)

在我的AppGlideModule中,我有:

@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());
}
Run Code Online (Sandbox Code Playgroud)

SvgDrawableTranscoder通过一种简单的方法将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我实现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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Svg Encoder 中 ```picture.writeToStream``` 已从 API 29 中删除,还有其他替代方案吗? (3认同)