Прежде всего, я использую libsvg-android , для которого требуется NDK, но который кажется очень быстрым, особенно если вам приходится часто перерисовывать SVG.На самом деле я использую эту модифицированную версию библиотеки, которая позволяет запрашивать ширину и высоту SVG, как указано в документе SVG.
Мой первый подход был следующим:
long svgID = SvgRaster.svgAndroidCreate();
SvgRaster.svgAndroidParseBuffer(svgID, svgString);
SvgRaster.svgAndroidSetAntialiasing(svgID, true);
Bitmap bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565);
SvgRaster.svgAndroidRenderToAreaUniform(svgID, new Canvas(bitmap), -300, -200, 1500, 1500);
Сначала анализируется источник SVG.Затем создается Bitmap
, который будет назначен на ImageView
позже.Затем SVG рендерится (увеличено до размера 1500x1500 пикселей) в растровое изображение.Обратите внимание на перевод (-300, -200), примененный, поскольку пользователь прокрутил представление изображения.
Это не работает.Кажется, отрицательные смещения не поддерживаются.
Вместо этого холст должен быть переведен следующим образом:
Canvas canvas = new Canvas(bitmap);
canvas.translate(-300, -200);
SvgRaster.svgAndroidRenderToAreaUniform(svgID, canvas, 0, 0, 1500, 1500);
Это работает, как и ожидалось.Перевод SVG применяется к холсту;Масштаб применяется путем настройки размера визуализированного SVG.Таким образом, вы можете получить большой SVG-документ и отобразить интересующую вас пропорцию в гораздо меньший битовый массив.
Я написал подкласс ImageView
, который можно прокручивать как по x, так и по y.направления и масштабирования.Его ресурс изображения - это растровое изображение SVG с низким разрешением.Когда пользователь прокручивает или увеличивает изображение, отображается эта версия SVG.Когда пользователь перестает взаимодействовать с изображением, я отображаю видимую на данный момент часть SVG в Bitmap
размере моего изображения и рисую его вместо изображения с низким разрешением.