Справочник API: SVG
Хотя Skia в первую очередь является низкоуровневым движком для рисования, Skija включает модуль SVG, который позволяет работать с файлами SVG напрямую. Это идеально подходит для иконок, простых иллюстраций и логотипов.
Загрузка и отрисовка
SVG в Skija управляется классом SVGDOM.
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() перед отрисовкой.
canvas.save();
canvas.translate(100, 100);
canvas.scale(2.0f, 2.0f); // Увеличить в два раза
svg.render(canvas);
canvas.restore();Доступ к корневому элементу
Вы можете получить корневой элемент <svg>, чтобы запросить исходные размеры или другие метаданные.
SVGSVG root = svg.getRoot();
if (root != null) {
Point size = root.getIntrinsicSize(); // Получить размер, определённый в файле SVG
}Совет по производительности: "Растровый кэш"
Отрисовка SVG может быть неожиданно затратной, потому что Skia должна разобрать XML-подобную структуру и выполнить множество команд рисования каждый раз.
Рекомендация: Если у вас есть иконка, которая появляется много раз (например, иконка папки в файловом менеджере), не вызывайте svg.render() для каждого экземпляра. Вместо этого отрисуйте её один раз в автономный Image и рисуйте это изображение.
// Сделать это один раз
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)
- Некоторыми малоизвестными эффектами фильтров
Для большинства иконок интерфейса и логотипов она работает идеально.