【问题标题】:Generated pictures with Universal Images Loader do not scale使用 Universal Images Loader 生成的图片无法缩放
【发布时间】:2026-01-17 02:30:01
【问题描述】:

我正在使用 android-svg 和 UniversalImageLoader 在自定义国际象棋组件中显示 svg 图片。虽然 chess 组件是 ImageView 的子类,但我不能只使用

ImageLoader.getInstance().displayImage()

因为图片没有填满ImageView,只是一个cell,cell的尺寸是在运行时计算出来的。

我试过用loadImage方法

ImageLoader.getInstance().loadImage("assets://svg/red_x_cross.svg",
            new ImageSize(sizePx, sizePx), loadedCompleteListener);

但好像我没有传递 ImageSize 对象:所有图像都保持原来的大小。

这是配置过程:

DisplayImageOptions displayImageOptions = new     DisplayImageOptions.Builder()
            .imageScaleType(ImageScaleType.EXACTLY)
            .cacheOnDisk(true)
            .cacheInMemory(true)
            .build();
ImageLoaderConfiguration config = new     ImageLoaderConfiguration.Builder(context)
            .memoryCacheSize(175 * 1024)
            .diskCacheSize(175 * 1024)
            .imageDecoder(new SvgDecoder())
            .defaultDisplayImageOptions(displayImageOptions)
            .build();
ImageLoader.getInstance().init(config);

这里是 SvgDecoder:

/**
 * Utility class in order to configure Universal Image Loader library.
 * Code from glide project sample
 */
public class SvgDecoder implements ImageDecoder {
    @Override
    public Bitmap decode(ImageDecodingInfo imageDecodingInfo) throws     IOException {
        InputStream is = imageDecodingInfo.getDownloader().getStream(
                imageDecodingInfo.getImageUri(),   imageDecodingInfo.getExtraForDownloader());

        SVG svg;
        try {
            svg = SVG.getFromInputStream(is);
        } catch (SVGParseException e) {
            e.printStackTrace();
            return null;
        }

        Picture picture = svg.renderToPicture();
        PictureDrawable pictureDrawable = new PictureDrawable(picture);
        // I think the problem is in this call parameters (getWidth/getHeight)
        // but what must I write instead ?
        Bitmap image = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),
                pictureDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas imageCanvas = new Canvas(image);

        svg.renderToCanvas(imageCanvas);

        return image;
    }
}

我使用的所有 svg 文件都定义了一个视图框。

我认为问题来自我从 Glide 库示例中复制粘贴的 SvgDecoder,但我不知道应该改写什么(我在哪里发表评论)。

【问题讨论】:

    标签: android universal-image-loader androidsvg


    【解决方案1】:

    当我说设置图像大小是 SvgDecoder 类的责任时,我的猜测非常好。事实上我必须

    • 从 UIL 扩展 BaseImageDecoder 类
    • 在构建位图后添加以下行(它将为我计算最终大小)

      decodedBitmap = 考虑ExactScaleAndOrientatiton(decodedBitmap, decoderInfo, 0, false);

    【讨论】: