API リファレンス: Canvas
Canvas クラスは、Skija におけるすべての描画操作の中心点です。変換やクリッピングを含む描画状態を管理します。
概要
Canvas はピクセル自体を保持しません。Surface や Bitmap などの宛先に描画コマンドを指示するインターフェースです。
状態管理
Canvas は状態のスタックを維持します。現在の状態(マトリックスとクリップ)を保存し、後で復元できます。
save(): 現在のマトリックスとクリップのコピーをスタックにプッシュします。保存カウントを返します。restore(): スタックをポップし、マトリックスとクリップを前の状態にリセットします。restoreToCount(count): 特定の保存カウントに復元します。getSaveCount(): 現在のスタックの深さを返します。
レイヤー
レイヤーは描画用のオフスクリーンバッファを作成し、復元時にメインキャンバスに合成されます。
saveLayer(rect, paint): 状態を保存し、描画をレイヤーにリダイレクトします。paintは、合成時にレイヤーのアルファ/ブレンディングを制御します。saveLayerAlpha(rect, alpha): 不透明度のみを変更する簡易版。saveLayer(SaveLayerRec): 高度なレイヤー制御(背景、タイルモード)。
java
// ぼかしフィルターを作成
ImageFilter blur = ImageFilter.makeBlur(10f, 10f, FilterTileMode.CLAMP);
SaveLayerRec rec = new SaveLayerRec(null, null, blur);
canvas.saveLayer(rec);
// ここで描画されたすべてのものは、ぼかされた背景の上に表示されます
// (「すりガラス」効果の作成)
canvas.drawRect(Rect.makeWH(200, 200), new Paint().setColor(0x80FFFFFF));
canvas.restore();変換
変換は、以降のすべての描画操作に影響します。
translate(dx, dy): 原点を移動します。scale(sx, sy): 座標をスケーリングします。rotate(degrees): 現在の原点を中心に回転します。skew(sx, sy): 座標系を傾斜させます。concat(matrix): カスタムのMatrix33またはMatrix44で乗算します。setMatrix(matrix): 現在のマトリックスを完全に置き換えます。resetMatrix(): 単位マトリックスにリセットします。getLocalToDevice(): 現在の総変換マトリックスを返します。
クリッピング
クリッピングは、描画が発生する領域を制限します。
clipRect(rect, mode, antiAlias): 矩形にクリップします。clipRRect(rrect, mode, antiAlias): 角丸矩形にクリップします。clipPath(path, mode, antiAlias): パスにクリップします。clipRegion(region, mode): 領域(ピクセル整列)にクリップします。
描画メソッド
基本プリミティブ
java
// 点を描画(ペイントのキャップに応じてピクセルまたは円)
canvas.drawPoint(50, 50, new Paint().setColor(0xFF0000FF).setStrokeWidth(5));
// 線を描画
canvas.drawLine(10, 10, 100, 100, paint);
// 矩形を描画(ペイントモードに応じて輪郭または塗りつぶし)
canvas.drawRect(Rect.makeXYWH(50, 50, 100, 100), paint);
// 円を描画
canvas.drawCircle(100, 100, 40, paint);
// 楕円を描画
canvas.drawOval(Rect.makeXYWH(50, 50, 100, 50), paint);
// 角丸矩形を描画(半径は複雑に設定可能)
canvas.drawRRect(RRect.makeXYWH(50, 50, 100, 100, 10), paint);
// 円弧を描画(扇形またはストローク)
// startAngle: 0 は右、sweepAngle: 時計回りの角度
canvas.drawArc(Rect.makeXYWH(50, 50, 100, 100), 0, 90, true, paint);drawPoint(x, y, paint): 単一の点を描画します。drawPoints(points, paint): 点のコレクションを描画します(ペイントのキャップに応じて線/ポリゴンも可能)。drawLine(x0, y0, x1, y1, paint): 線分を描画します。drawLines(points, paint): 各点のペアに対して独立した線分を描画します。drawRect(rect, paint): 矩形を描画します。drawOval(rect, paint): 楕円を描画します。drawCircle(x, y, radius, paint): 円を描画します。drawRRect(rrect, paint): 角丸矩形を描画します。drawDRRect(outer, inner, paint): 2つの角丸矩形の間の領域(環状領域)を描画します。drawArc(rect, startAngle, sweepAngle, useCenter, paint): 扇形(パイスライス)または円弧ストロークを描画します。drawPath(path, paint): パスを描画します。drawRegion(region, paint): 特定の領域を描画します。
塗りつぶしとクリア
java
// キャンバス/レイヤー全体を特定の色で塗りつぶす(既存のコンテンツとブレンド)
canvas.drawColor(0x80FF0000); // 50% 赤のオーバーレイ
// キャンバス全体を透明にクリアする(コンテンツを置き換え、ブレンドなし)
canvas.clear(0x00000000);
// 現在のクリップ領域を特定のペイントで塗りつぶす
// 画面をシェーダーや複雑なペイント効果で塗りつぶすのに便利
canvas.drawPaint(new Paint().setShader(myGradient));clear(color): クリップ領域全体を色で塗りつぶします(ピクセルを置き換え、ブレンドを無視します)。drawColor(color, mode): クリップ領域を色で塗りつぶします(ブレンドを尊重します)。drawPaint(paint): クリップ領域を指定されたペイントで塗りつぶします(シェーダーでの塗りつぶしに便利)。
画像とビットマップ
java
// 画像を (0, 0) に描画
canvas.drawImage(image, 0, 0);
// 画像を特定の矩形にスケーリングして描画
canvas.drawImageRect(image, Rect.makeXYWH(0, 0, 200, 200));
// 9スライス画像を描画(スケーラブルなUI要素)
// center: ソース画像の中間のスケーラブル領域
// dst: 描画先のターゲット矩形
canvas.drawImageNine(image, IRect.makeLTRB(10, 10, 20, 20), Rect.makeXYWH(0, 0, 100, 50), FilterMode.LINEAR, null);drawImage(image, x, y, paint): 座標に画像を描画します。drawImageRect(image, src, dst, sampling, paint, strict): 画像の一部をスケーリングして宛先矩形に描画します。drawImageNine(image, center, dst, filter, paint): 9スライスのスケーラブルな画像を描画します。drawBitmap(bitmap, x, y, paint): ビットマップ(ラスターデータ)を描画します。
テキスト
java
// シンプルなテキスト描画
canvas.drawString("Hello World", 50, 50, font, paint);
// TextBlob を使用した高度なテキスト描画(事前計算されたレイアウト)
canvas.drawTextBlob(blob, 50, 50, paint);
// TextLine の描画(Shaper から)
canvas.drawTextLine(line, 50, 50, paint);drawString(string, x, y, font, paint): シンプルな文字列を描画します。drawTextBlob(blob, x, y, paint): 事前計算されたテキストブロブを描画します。drawTextLine(line, x, y, paint): シェイプされたTextLineを描画します。
高度な描画
java
// 三角形メッシュを描画(カスタム3D効果やワープ用)
canvas.drawVertices(
new Point[] { new Point(0, 0), new Point(100, 0), new Point(50, 100) },
new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF }, // 頂点ごとの色
null, // テクスチャ座標なし
null, // インデックスなし(頂点を順番に使用)
BlendMode.MODULATE,
new Paint()
);
// 矩形のドロップシャドウを描画
// (手動でシャドウフィルターを作成するよりも簡単)
canvas.drawRectShadow(
Rect.makeXYWH(50, 50, 100, 100),
5, 5, // dx, dy
10, // ぼかし
0, // 広がり
0x80000000 // シャドウ色
);drawPicture(picture): 記録されたPictureを再生します。drawDrawable(drawable): 動的なDrawableオブジェクトを描画します。drawVertices(positions, colors, texCoords, indices, mode, paint): 三角形メッシュを描画します。drawPatch(cubics, colors, texCoords, mode, paint): クーンパッチを描画します。drawRectShadow(rect, dx, dy, blur, spread, color): シンプルなドロップシャドウを描画するヘルパー。
ピクセルアクセス
java
// キャンバスからピクセルを読み取り、ビットマップに格納
Bitmap bmp = new Bitmap();
bmp.allocPixels(ImageInfo.makeN32Premul(100, 100));
canvas.readPixels(bmp, 0, 0); // キャンバスの (0,0) から読み取り開始
// ピクセルをキャンバスに書き戻す
canvas.writePixels(bmp, 50, 50);readPixels(bitmap, srcX, srcY): キャンバスからピクセルを読み取り、ビットマップに格納します。writePixels(bitmap, x, y): ビットマップからピクセルをキャンバスに書き込みます。