API 参考:SVG
虽然 Skia 主要是一个底层绘图引擎,但 Skija 包含一个 SVG 模块,允许你直接处理 SVG 文件。这非常适合图标、简单插图和徽标。
加载与渲染
Skija 中的 SVG 由 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. 将其渲染到画布上
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);限制
Skija 的 SVG 实现是完整 SVG 规范的“子集”。它支持大多数常见功能(形状、路径、填充、渐变),但可能难以处理:
- 复杂的 CSS 样式
- 脚本(SVG 内的 JavaScript)
- 某些晦涩的滤镜效果
对于大多数 UI 图标和徽标,它都能完美工作。