Декодирование SVG с AndroidSVG и Universal Image Loader
Я пытаюсь отобразить SVG с 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.) Рендеринг занимает слишком много времени, и logcat показывает что-то вроде этого:
01-06 23: 48: 15.310 15505-15506 / de.phcom.epaper2 D / dalvikvm ﹕ GC_CONCURRENT освобожден 2048K, 10% свободен 26540K/29187K, приостановлен 1 мс +29 мс 01-06 23:48:15.645 15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT освобожден 2046K, 10% свободен 26541K/29187K, приостановлен 2ms+27ms 01-06 23:48:15.970 15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT освобожден 20% 477 26542K / 29187K, пауза 1 мс +28 мс 01-06 23:48:16,305 15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT освобождена 2049K, 10% свободна 26541K/29187K, пауза 2 мс +29 мс 01-06 23:48:16.650 15505-15506/de.phcom.epaper2 D/dalvikvm﹕ GC_CONCURRENT освобожден 2051K, 10% свободен 26538K/29187K, приостановлено 1 мс + 27 мс
Итак, как я могу улучшить производительность и решить проблемы? Есть ли лучший способ интеграции SVG с UIL?
1 ответ
Ваш SVG в основном состоит из <image>
элемент, который ссылается на большое внешнее изображение всей вашей страницы. На самом деле это не лучший способ использования SVG.
В любом случае, ответ на ваш вопрос следующий:
Причина, по которой ваше изображение не отображается, состоит в том, что AndroidSVG не знает, где его найти. Вы должны создать реализацию класса SVGExternalFileResolver и передать ее в SVG с помощью метода registerExternalFileResolver().
В вашей реализации SVGExternalFileResolver вам необходимо переопределить метод resolImage(). Когда рендеринг должен построить изображение, он передаст имя файла из файла SVG (в данном случае "page_0001_img68.png"), и вам нужно будет загрузить и декодировать PNG и вернуть объект Bitmap.