使用AndroidSVG和Universal Image Loader解码SVG

时间:2014-01-06 22:57:41

标签: android svg androidsvg

我试图用uil显示svgs。我使用androidsvg(http://code.google.com/p/androidsvg/)编写了我自己的imagedecoder,如下所示:

public class SVGImageDecoder implements ImageDecoder {

@Override
public Bitmap decode(ImageDecodingInfo imageDecodingInfo) throws IOException {
    Bitmap decodedBitmap = null;

    InputStream inputStream = getImageStream(imageDecodingInfo);
    SVG svg = null;
    try {
        svg = SVG.getFromInputStream(inputStream);
    } catch (SVGParseException e) {
        e.printStackTrace();
    }
    Picture picture = svg.renderToPicture();
    PictureDrawable pictureDrawable = new PictureDrawable(picture);
    decodedBitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),
            pictureDrawable.getIntrinsicHeight(), Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(decodedBitmap);
    // Clear background to white
    canvas.drawRGB(255, 255, 255);
    svg.renderToCanvas(canvas);
    return decodedBitmap;
}

protected InputStream getImageStream(ImageDecodingInfo decodingInfo) throws IOException {
    return decodingInfo.getDownloader().getStream(decodingInfo.getImageUri(), decodingInfo.getExtraForDownloader());
}
}

显示SVG,但出现以下问题:

1。)不渲染和显示颜色和图片 2.)渲染时间过长,logcat显示如下:

01-06 23:48:15.310  15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT freed 2048K, 10% free 26540K/29187K, paused 1ms+29ms
01-06 23:48:15.645  15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT freed 2046K, 10% free 26541K/29187K, paused 2ms+27ms
01-06 23:48:15.970  15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT freed 2047K, 10% free 26542K/29187K, paused 1ms+28ms
01-06 23:48:16.305  15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT freed 2049K, 10% free 26541K/29187K, paused 2ms+29ms
01-06 23:48:16.650  15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT freed 2051K, 10% free 26538K/29187K, paused 1ms+27ms

那么,我该如何提高性能并解决问题呢?是否有更好的方法将svgs与uil集成?

1 个答案:

答案 0 :(得分:0)

您的SVG基本上只包含一个<image>元素,该元素引用整个页面的大型外部图像。这并不是以最好的方式使用SVG。

无论如何,你的问题的答案如下:

您的图片没有显示的原因是AndroidSVG不知道在哪里找到它。您必须创建SVGExternalFileResolver类的实现,并使用registerExternalFileResolver()方法将其传递给SVG。

在SVGExternalFileResolver的实现中,您需要覆盖resolveImage()方法。当渲染需要绘制图像时,它将传递SVG文件中的文件名(在本例中为&#34; page_0001_img68.png&#34;),您必须加载并解码PNG并传回Bitmap对象。