Как нарисовать только часть возможно большого и / или увеличенного SVG? - PullRequest
1 голос
/ 03 февраля 2012

Я хотел бы показать масштабируемый и прокручиваемый SVG-карту в моем приложении.Единственный способ сделать это без написания вашей собственной библиотеки и т. Д. - это использовать существующую библиотеку, каждая из которых, кажется, отображает SVG в Bitmap, который может быть назначен, например, ImageView.1004 * Базовое растровое изображение быстро становится очень большим, что может привести к исключению нехватки памяти.Как мне нарисовать только часть возможно большого и / или увеличенного SVG до Bitmap?Масштабирование небольшого растрового изображения выглядит плохо и не вариант.

Я собираюсь ответить на этот вопрос сам, потому что я некоторое время искал ответ, нашел его разбросанным по всей сети (но не здесь) и думаю, что это может быть полезно для других.

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Разве вы не можете использовать библиотеку Google svg-android ? Вы можете масштабировать Canvas до правильного размера перед рендерингом.

0 голосов
/ 04 февраля 2012

Прежде всего, я использую 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 размере моего изображения и рисую его вместо изображения с низким разрешением.

0 голосов
/ 03 февраля 2012

Это будет похоже на работу карт Google?По-видимому, они растут и увеличивают / уменьшают детализацию при увеличении и уменьшении масштаба.

В прошлом я делал нечто подобное, не уверен, что так было в Google, но моя схема работала исключительно хорошо для меня.Я разбил свою карту на прямоугольные области, затем вычислил, в каких областях была видимая часть, и извлек данные только из этих областей.Каждая прямоугольная область была подразделена, чтобы обеспечить больше деталей, если пользователь увеличил масштаб. Я продолжал разделять до уровня, который я хотел, я остановился на трех, потому что я использовал сетку 10 X 10, так что каждый уровень был эффективным увеличением 10 -на третьем уровне я просматривал в 100 раз больше деталей, которые просматривал на первом уровне, что было достаточно для моих нужд.

Я даже мог анимировать это так, чтобы при увеличении масштаба вы плавно «летали» ближена местности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...