Skip to content

Справочник API: SVG

Хотя Skia в первую очередь является низкоуровневым движком для рисования, Skija включает модуль SVG, который позволяет работать с файлами SVG напрямую. Это идеально подходит для иконок, простых иллюстраций и логотипов.

Загрузка и отрисовка

SVG в Skija управляется классом SVGDOM.

java
import io.github.humbleui.skija.svg.SVGDOM;

// 1. Загрузить данные SVG
Data svgData = Data.makeFromFileName("assets/logo.svg");
SVGDOM svg = new SVGDOM(svgData);

// 2. Определить размер области просмотра
// Это важно! SVG часто не имеют фиксированного размера.
svg.setContainerSize(200, 200);

// 3. Отрисовать его на Canvas
svg.render(canvas);

Масштабирование SVG

Поскольку SVG основаны на векторах, их можно масштабировать до любого размера без потери качества. Просто измените setContainerSize или используйте canvas.scale() перед отрисовкой.

java
canvas.save();
canvas.translate(100, 100);
canvas.scale(2.0f, 2.0f); // Увеличить в два раза
svg.render(canvas);
canvas.restore();

Доступ к корневому элементу

Вы можете получить корневой элемент <svg>, чтобы запросить исходные размеры или другие метаданные.

java
SVGSVG root = svg.getRoot();
if (root != null) {
    Point size = root.getIntrinsicSize(); // Получить размер, определённый в файле SVG
}

Совет по производительности: "Растровый кэш"

Отрисовка SVG может быть неожиданно затратной, потому что Skia должна разобрать XML-подобную структуру и выполнить множество команд рисования каждый раз.

Рекомендация: Если у вас есть иконка, которая появляется много раз (например, иконка папки в файловом менеджере), не вызывайте svg.render() для каждого экземпляра. Вместо этого отрисуйте её один раз в автономный Image и рисуйте это изображение.

java
// Сделать это один раз
Surface cache = Surface.makeRasterN32Premul(width, height);
svg.render(cache.getCanvas());
Image cachedIcon = cache.makeImageSnapshot();

// Использовать это в цикле отрисовки
canvas.drawImage(cachedIcon, x, y);

Ограничения

Реализация SVG в Skija является "подмножеством" полной спецификации SVG. Она поддерживает большинство распространённых функций (фигуры, пути, заливки, градиенты), но может не справиться с:

  • Сложным CSS-оформлением
  • Скриптами (JavaScript внутри SVG)
  • Некоторыми малоизвестными эффектами фильтров

Для большинства иконок интерфейса и логотипов она работает идеально.