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. Canvasにレンダリング
svg.render(canvas);SVGのスケーリング
SVGはベクターベースであるため、品質を損なうことなく任意のサイズに拡大縮小できます。レンダリング前にsetContainerSizeを変更するか、canvas.scale()を使用するだけです。
java
canvas.save();
canvas.translate(100, 100);
canvas.scale(2.0f, 2.0f); // 2倍の大きさにする
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アイコンやロゴでは、完璧に動作します。