Matrix — Android SDK (android.graphics.Matrix) のクラスで、3×3行列を通じてアフィン変換を表します。グラフィックオブジェクトの変換—移動、スケーリング、回転、スキュー—に使用されます。Android Developers Documentation (2026) によると、Matrix は Canvas、Bitmap、Drawable における変換のための主要ツールであり、カスタムドローイングにおいて精確な坐標制御を提供します。
メインポイント
Matrix (android.graphics.Matrix) — Android SDKのクラスで、二次元坐標を変換するための数学的な3×3行列を表します。Matrixは、Androidにおけるすべてのグラフィック変換の基本ブロックです—Canvasの移動やスケーリングから、Bitmapの複雑な遠近変形まで。
iOSが独立したCGAffineTransform(アフィン)とCATransform3D(3D)構造を使用するのと異なり、Androidはアフィン変換と遠近変換を単一のMatrixクラスに統合しています。3×3行列は、標準のアフィン操作(最後の行[0, 0, 1])と、最後の行が任意の値を持つ遠近変形の両方を表すことができます。これにより柔軟性が向上しますが、行列数学の理解が必要です。
MatrixはCanvas APIと密接に連携しています。ディベロッパーがcanvas.translate()、canvas.scale()またはcanvas.rotate()を呼び出すと、これらのメソッドはグラフィックコンテキストの行列を内部的に変更します。現在のCanvas行列はcanvas.getMatrix()で取得し、canvas.setMatrix()またはcanvas.concat()でカスタム行列を手動で適用できます。
Matrixは、アフィン変換の基本タイプを4つサポートしています:translate、scale、rotate、skew(歪み)。各タイプには、事前乗算(pre)、事後乗算(post)、設定(set)のメソッドがあります。preTranslateとpostTranslateの違いは行列の乗算順序にあり、操作を組み合わせた際の最終的な変換に影響します。
| 操作 | メソッド | パラメータ | 説明 |
|---|---|---|---|
| 移動 | setTranslate / preTranslate / postTranslate | dx, dy | X軸およびY軸に沿う移動 |
| スケール | setScale / preScale / postScale | sx, sy, px, py | 支点を中心にスケール |
| 回転 | setRotate / preRotate / postRotate | degrees, px, py | 支点を中心に回転 |
| 歪み | setSkew / preSkew / postSkew | kx, ky | 軸に沿った傾き(シア) |
Translateは、指定した移動量dx, dyだけすべての点の位置を変更します。正のdxは右へ、dyは下へ(Androidのスクリーン坐標系ではY軸は下向き)移動します。Translateはオブジェクトの形状を変えません—位置のみを変更します。これは要素を配置するための最も簡単で最もよく使われる操作です。
Scaleは、オブジェクトのサイズを系数sx(X方向)とsy(Y方向)で変更します。パラメータpx, pyはスケーリングの支点を指定します。px, pyが指定されていない場合、スケーリングは原点(0, 0)を中心に実行されます。sx = syの場合、オブジェクトは一律にスケールされます。負の値は反射を生成します。
Rotateは、支点(px, py)を中心にオブジェクトを指定された角度(度)だけ回転させます。正の角度は時計回りの回転に対応します(iOS/macOSでは正の角度が反時計回りであることとは異なります)。px, pyが指定されていない場合、回転は原点を中心に実行されます。
Skew(シア)は、X軸またはY軸に沿ってオブジェクトを倾けて変形させます。値1.0は45度の傾きに対応します。Skewは、傾き効果や仮想3Dアピール、遠近変形の作成に使用されます。
Matrixは、3×3行列の要素を9つの浮動小数点値(float[9])の内部配列に保存します。配列順序は列優先(column-major)で、標準的な数学表現と一致します。個々の要素へのアクセスは定数を通して行います:Matrix.MSCALE_X、Matrix.MSKEW_Y、Matrix.MTRANS_Xなど。
行列は次のように構成されています:最初の2カラム(MSCALE_X、MSKEW_X、MSKEW_Y、MSCALE_Y)がスケーリング、回転、歪みを担当します。第3カラム(MTRANS_X、MTRANS_Y、MPERSP_2)が移動と遠近を担当します。アフィン変換では、MPERSP_0とMPERSP_1は0で、MPERSP_2は1です。
行列の値を取得するには、getValues(float[] values)を使用します。これで9つの要素からなる配列を填まします。値を設定するにはsetValues(float[] values)を使用します。これにより、標準のtranslate、scale、rotate、skewメソッドを超えた複雑なカスタム変換のために行列を直接操作することができます。
Matrixは、現在の状態を分類するためのいくつかのメソッドを提供しています。isIdentity()は行列が単位行列かどうかを確認します。isAffine()はアフィン変換のみか(MPERSP_0 = 0、MPERSP_1 = 0、MPERSP_2 = 1)を確認します。これらの確認は最適化に役立ちます:行列が単位行列の場合、変換をスキップできます。
Matrixはいくつかのカテゴリの操作をサポートしています:設定(set)、事前乗算(pre)、事後乗算(post)、結合(concat)、逆行列(invert)、マッピング(map)。各カテゴリは複雑な変換を構築する際にそれぞれの目的を果たします。
preTranslateは、現在の行列に左から移動行列を乗じます:result = translate × current。postTranslateは右から乗じます:result = current × translate。違いは適用順序にあります:pre操作は現在の変換より前に適用され、post操作は後に適用されます。同様のpreScale、postScale、preRotate、postRotate、preSkew、postSkewがあります。
invert(Matrix inverse)は逆行列を計算します。元の行列が特異(行列式がゼロ)の場合、falseを返します。concat(Matrix other)は現在の行列に与えられた行列を乗じます:set = set × other。逆の順序にはsetConcat(other, this)を使用します。
mapRect(RectF rect)は矩形を変換し、結果を新しいRectFで返します。mapPoints(float[] dst, float[] src)は点の配列を変換します。mapVectors(float[] dst, float[] src)は移動を考慮せずにベクトルを変換します。mapRectは変換後のバウンディングボックスの計算に役立ちます。
MatrixはAndroidグラフィックスの2つの主要シナリオで活用されています:Canvas変換とBitmap変換です。どちらの場合でも、Matrixがグラフィック出力の変更方法を決定します。
Canvasは、現在の行列を完全に置き換えるためのcanvas.setMatrix(matrix)と、現在の変換に与えられた行列を乗じるためのcanvas.concat(matrix)を提供しています。Matrixを適用すると、その後のすべてのドローイング—drawBitmap、drawRect、drawPathの呼び出し—は変換された坐標系で実行されます。Canvasはsave()とrestore()で状態を保存するスタックも維持しています。
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter)は、指定された変換を適用して新しいBitmapを作成します。これは、元のBitmapを失わずに、スケール、回転、または変形された画像コピーを作成するための強力なツールです。filterパラメータはピクセル補間時のアンチエイリアシングを制御します。
setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) — Matrixの独特の機能で、CGAffineTransformに直接の対応がありません。これは、ある多角形から別の多角形へ点を変換する行列を計算します。pointCount = 4で、完全な遠近(投影)変換が作成され、遠近変形を伴うBitmapの重ね合わせが可能になります。
Kotlinを使ったAndroidアプリでのMatrixによるグラフィックス変換の実践例を見てみましょう。
例は、組み合わせた変換のためのMatrixを作成します:(100, 50)の移動、1.5xのスケーリング、45度の回転。preRotateとpreScaleの後にpostTranslateを使用することで、操作の適用順序が変わります。
val matrix = Matrix()
matrix.preScale(1.5f, 1.5f)
matrix.preRotate(45f)
matrix.postTranslate(100f, 50f)
// 点に適用
val pts = floatArrayOf(0f, 0f, 100f, 100f)
matrix.mapPoints(pts)
// 矩形に適用
val rect = RectF(0f, 0f, 200f, 100f)
matrix.mapRect(rect)
例は、円を中心の回りに回転・スケールするためにonDrawでCanvasにMatrixを適用する方法を示しています。Canvasの状態を保存および復元することで、変換が後続のドローイング要素に影響しないようにします。
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val cx = width / 2f
val cy = height / 2f
val radius = 100f
canvas.save()
val matrix = Matrix()
matrix.postTranslate(cx, cy)
matrix.postRotate(30f)
matrix.postScale(1.2f, 1.2f)
canvas.concat(matrix)
val paint = Paint().apply {
color = Color.BLUE
style = Paint.Style.FILL
}
canvas.drawCircle(0f, 0f, radius, paint)
canvas.restore()
}
例はsetPolyToPolyを使用してBitmapの遠近変形を作成します。4つのソース点(元の矩形の角)が、台形を形成する4つのターゲット点にマッピングされます。結果は、空間で傾いた画像の効果です。
fun applyPerspective(
bitmap: Bitmap,
skew: Float
): Bitmap {
val w = bitmap.width.toFloat()
val h = bitmap.height.toFloat()
val src = floatArrayOf(0f, 0f, w, 0f,
0f, h, w, h)
val dst = floatArrayOf(skew, 0f, w - skew, 0f,
0f, h, w, h)
val matrix = Matrix()
matrix.setPolyToPoly(src, 0, dst, 0, 4)
return Bitmap.createBitmap(
bitmap, 0, 0,
w.toInt(), h.toInt(),
matrix, true
)
}
よくある質問
Matrixは、1つの3×3行列を通じて二次元のアフィンおよび遠近変換を扱います。Camera (android.graphics.Camera)は、三次元カメラをシミュレートするより高いレベルのクラスです:3D回転を作成し、その結果を2D Matrixに投影します。Cameraは内部的にMatrixを使用しています。
postRotate(90f)でMatrixを作成し、Bitmap.createBitmap(original, 0, 0, w, h, matrix, true)に渡します。90度回転すると、結果の幅と高さが入れ替わります。任意の角度で回転する場合は、空白领域を避けるためにクロッピングが必要になることがあります。
matrix.invert(resultMatrix)を使用します。逆行列が成功した場合はtrueを返し、逆行列をresultMatrixに記入します。行列が特異の場合(例:スケールがゼロ)には逆行列が不可能になります。帰り値を必ず確認してください。
preは新しい変換を左から乗じます:result = operation × current — 操作は現在のものより前に適用されます。postは右から乗じます:result = current × operation — 操作は後に適用されます。preRotate + postTranslateの場合:まず回転、その後移動です。
はい、MatrixはJetpack ComposeでCanvas Composeとの相互作用においてandroid.graphics.Matrixクラスを通じて使用されます。Composeでは、変換(scale、rotationX、translationXなど)にgraphicsLayerが利用可能ですが、複雑なBitmap変換にはdrawWithContentやdrawBehindのコードでMatrixが使用されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。