AndroidのMatrixとは何か、行列のタイプと変換の仕組み

著者: IT Sectr 公開日: 2026-07-22 読了時間: 9 分

Matrix — Android SDK (android.graphics.Matrix) のクラスで、3×3行列を通じてアフィン変換を表します。グラフィックオブジェクトの変換—移動、スケーリング、回転、スキュー—に使用されます。Android Developers Documentation (2026) によると、Matrix は Canvas、Bitmap、Drawable における変換のための主要ツールであり、カスタムドローイングにおいて精確な坐標制御を提供します。

メインポイント

  • Matrix — 3×3行列でアフィンおよび遠近変換を行うAndroidクラス
  • アフィン操作: translate(移動)、scale(スケール)、rotate(回転)、skew(歪み)
  • MatrixはsetPolyToPolyで、投影変換をサポートします
  • 操作の順序が重要—Matrix.concatで順次乗算を実行
  • MatrixはAndroidグラフィックスのCanvas、Bitmap、RectF、PointF、Pathに適用されます

AndroidでのMatrixとは?

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変換のタイプ

Matrixは、アフィン変換の基本タイプを4つサポートしています:translate、scale、rotate、skew(歪み)。各タイプには、事前乗算(pre)、事後乗算(post)、設定(set)のメソッドがあります。preTranslateとpostTranslateの違いは行列の乗算順序にあり、操作を組み合わせた際の最終的な変換に影響します。

操作メソッドパラメータ説明
移動setTranslate / preTranslate / postTranslatedx, dyX軸およびY軸に沿う移動
スケールsetScale / preScale / postScalesx, sy, px, py支点を中心にスケール
回転setRotate / preRotate / postRotatedegrees, px, py支点を中心に回転
歪みsetSkew / preSkew / postSkewkx, 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アピール、遠近変形の作成に使用されます。

3×3行列の構造

Matrixは、3×3行列の要素を9つの浮動小数点値(float[9])の内部配列に保存します。配列順序は列優先(column-major)で、標準的な数学表現と一致します。個々の要素へのアクセスは定数を通して行います:Matrix.MSCALE_XMatrix.MSKEW_YMatrix.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の基本操作

Matrixはいくつかのカテゴリの操作をサポートしています:設定(set)、事前乗算(pre)、事後乗算(post)、結合(concat)、逆行列(invert)、マッピング(map)。各カテゴリは複雑な変換を構築する際にそれぞれの目的を果たします。

PreおよびPost操作

preTranslateは、現在の行列に左から移動行列を乗じます:result = translate × currentpostTranslateは右から乗じます:result = current × translate。違いは適用順序にあります:pre操作は現在の変換より前に適用され、post操作は後に適用されます。同様のpreScale、postScale、preRotate、postRotate、preSkew、postSkewがあります。

逆行列と結合

invert(Matrix inverse)は逆行列を計算します。元の行列が特異(行列式がゼロ)の場合、falseを返します。concat(Matrix other)は現在の行列に与えられた行列を乗じます:set = set × other。逆の順序にはsetConcat(other, this)を使用します。

Map — 点および矩形への適用

mapRect(RectF rect)は矩形を変換し、結果を新しいRectFで返します。mapPoints(float[] dst, float[] src)は点の配列を変換します。mapVectors(float[] dst, float[] src)は移動を考慮せずにベクトルを変換します。mapRectは変換後のバウンディングボックスの計算に役立ちます。

CanvasとBitmapでの応用

MatrixはAndroidグラフィックスの2つの主要シナリオで活用されています:Canvas変換とBitmap変換です。どちらの場合でも、Matrixがグラフィック出力の変更方法を決定します。

MatrixによるCanvas変換

Canvasは、現在の行列を完全に置き換えるためのcanvas.setMatrix(matrix)と、現在の変換に与えられた行列を乗じるためのcanvas.concat(matrix)を提供しています。Matrixを適用すると、その後のすべてのドローイング—drawBitmap、drawRect、drawPathの呼び出し—は変換された坐標系で実行されます。Canvasはsave()restore()で状態を保存するスタックも維持しています。

MatrixによるBitmap変換

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter)は、指定された変換を適用して新しいBitmapを作成します。これは、元のBitmapを失わずに、スケール、回転、または変形された画像コピーを作成するための強力なツールです。filterパラメータはピクセル補間時のアンチエイリアシングを制御します。

setPolyToPoly — 遠近変換

setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) — Matrixの独特の機能で、CGAffineTransformに直接の対応がありません。これは、ある多角形から別の多角形へ点を変換する行列を計算します。pointCount = 4で、完全な遠近(投影)変換が作成され、遠近変形を伴うBitmapの重ね合わせが可能になります。

Kotlinコード例

Kotlinを使ったAndroidアプリでのMatrixによるグラフィックス変換の実践例を見てみましょう。

基本アフィン変換

例は、組み合わせた変換のためのMatrixを作成します:(100, 50)の移動、1.5xのスケーリング、45度の回転。preRotateとpreScaleの後にpostTranslateを使用することで、操作の適用順序が変わります。

kotlin
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)

saveとrestoreを使用したCanvas変換

例は、円を中心の回りに回転・スケールするためにonDrawでCanvasにMatrixを適用する方法を示しています。Canvasの状態を保存および復元することで、変換が後続のドローイング要素に影響しないようにします。

kotlin
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による遠近変形

例はsetPolyToPolyを使用してBitmapの遠近変形を作成します。4つのソース点(元の矩形の角)が、台形を形成する4つのターゲット点にマッピングされます。結果は、空間で傾いた画像の効果です。

kotlin
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
    )
}

よくある質問

AndroidでのMatrixとCameraの違いは?

Matrixは、1つの3×3行列を通じて二次元のアフィンおよび遠近変換を扱います。Camera (android.graphics.Camera)は、三次元カメラをシミュレートするより高いレベルのクラスです:3D回転を作成し、その結果を2D Matrixに投影します。Cameraは内部的にMatrixを使用しています。

Bitmapを90度回転するには?

postRotate(90f)でMatrixを作成し、Bitmap.createBitmap(original, 0, 0, w, h, matrix, true)に渡します。90度回転すると、結果の幅と高さが入れ替わります。任意の角度で回転する場合は、空白领域を避けるためにクロッピングが必要になることがあります。

Matrixの逆変換を取得するには?

matrix.invert(resultMatrix)を使用します。逆行列が成功した場合はtrueを返し、逆行列をresultMatrixに記入します。行列が特異の場合(例:スケールがゼロ)には逆行列が不可能になります。帰り値を必ず確認してください。

preとpost操作の違いは?

preは新しい変換を左から乗じます:result = operation × current — 操作は現在のものより前に適用されます。postは右から乗じます:result = current × operation — 操作は後に適用されます。preRotate + postTranslateの場合:まず回転、その後移動です。

ComposeでMatrixを使用できますか?

はい、MatrixはJetpack ComposeでCanvas Composeとの相互作用においてandroid.graphics.Matrixクラスを通じて使用されます。Composeでは、変換(scale、rotationX、translationXなど)にgraphicsLayerが利用可能ですが、複雑なBitmap変換にはdrawWithContentdrawBehindのコードでMatrixが使用されます。

まとめ

  • Matrix — 3×3行列でアフィンおよび遠近変換を行うAndroidクラス
  • 4つの基本タイプ:translate、scale、rotate、skew
  • pre/post操作で適用順序を制御:preは現在のものより前、postは現在の変換の後
  • setPolyToPoly — 4つの点ペアから遠近変換を計算する独自の関数
  • MatrixはCanvasにはconcat、BitmapにはcreateBitmapとMatrix、点にはmapPointsで適用
  • invertは逆変換を計算し、特異行列にはfalseを返す
  • isAffineisIdentityで行列の状態を分類し最適化に役立てる

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください