Декодирование SVG с помощью AndroidSVG и универсального загрузчика изображений

Я пытаюсь отобразить svgs с помощью uil. Я написал свой собственный декодер изображений, используя androidsvg (http://code.google.com/p/androidsvg/) вот так:

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.) Рендеринг занимает слишком много времени и логарифм показывает что-то вроде этого:

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?


person Robin    schedule 06.01.2014    source источник


Ответы (1)


Ваш SVG в основном состоит из элемента <image>, который ссылается на большое внешнее изображение всей вашей страницы. На самом деле это не лучший способ использования SVG.

В любом случае, ответ на ваш вопрос следующий:

Причина, по которой ваше изображение не отображается, заключается в том, что AndroidSVG не знает, где его найти. Вы должны создать реализацию класса SVGExternalFileResolver и передать ее в SVG с помощью метода registerExternalFileResolver().

В вашей реализации SVGExternalFileResolver вам необходимо переопределить метод resolveImage(). Когда рендеру необходимо отобразить изображение, он передает имя файла из файла SVG (в данном случае «page_0001_img68.png»), и вам нужно загрузить и декодировать PNG и вернуть объект Bitmap.

person Paul LeBeau    schedule 03.02.2014