Android'de Matrix: nedir, matris türleri ve dönüşümlerle çalışma

Yazar: IT Sectr Yayınlanma: 2026-07-22 Okuma süresi: 9 dk

Matrix — Android SDK'dan (android.graphics.Matrix) 3×3 matris aracılığıyla afin dönüşümü temsil eden bir sınıftır. Grafik nesnelerini dönüştürmek için kullanılır — taşıma, ölçekleme, döndürme ve eğme. Android Developers Documentation (2026)'ye göre Matrix, Canvas, Bitmap ve Drawable'da dönüşümlerle çalışmak için ana araçtır ve özel çizimde hassas koordinat kontrolü sağlar.

Anahtar Noktalar

  • Matrix — 3×3 matris ile afin ve perspektif dönüşümler için Android sınıfı
  • Afin işlemler: translate (taşıma), scale (ölçekleme), rotate (döndürme) ve skew (eğme)
  • Matrix, setPolyToPoly aracılığıyla projektif dönüşümleri destekler
  • İşlem sırası önemlidir — Matrix.concat sıralı çarpma gerçekleştirir
  • Matrix, Android grafiklerinde Canvas, Bitmap, RectF, PointF ve Path'e uygulanır

Android'de Matrix Nedir?

Matrix (android.graphics.Matrix) — iki boyutlu koordinatları dönüştürmek için kullanılan matematiksel bir 3×3 matrisi temsil eden Android SDK sınıfıdır. Matrix, Android'deki tüm grafik dönüşümleri için temel yapı taşıdır — Canvas hareketi ve ölçeklemesinden Bitmap'in karmaşık perspektif bozulmalarına kadar.

Ayrı CGAffineTransform (afin) ve CATransform3D (3D) yapıları kullanan iOS'un aksine Android, afin ve perspektif dönüşümlerini tek bir Matrix sınıfında birleştirir. 3×3 matris, hem standart afin işlemlerini (son satır [0, 0, 1]) hem de son satırın rastgele değerler içerdiği perspektif bozulmalarını temsil etmeye olanak tanır. Bu daha fazla esneklik sağlar ancak matris matematiği anlayışı gerektirir.

Matrix, Canvas API ile yakından entegredir. Bir geliştirici canvas.translate(), canvas.scale() veya canvas.rotate() çağrısı yaptığında, bu yöntemler grafik bağlamının matrisini dahili olarak değiştirir. Geçerli Canvas matrisi canvas.getMatrix() ile alınabilir ve özel bir matris canvas.setMatrix() veya canvas.concat() ile manuel olarak uygulanabilir.

Matrix Dönüşüm Türleri

Matrix dört temel afin dönüşüm türünü destekler: translate, scale, rotate, skew (eğme). Her tür, ön-çarpma (pre), sonra-çarpma (post) ve ayarlama (set) için yöntemlere sahiptir. preTranslate ve postTranslate arasındaki fark, matris çarpma sırasındadır ve işlemleri birleştirirken nihai dönüşümü etkiler.

İşlemYöntemParametrelerAçıklama
TaşımasetTranslate / preTranslate / postTranslatedx, dyX ve Y eksenleri boyunca kaydırma
ÖlçeklemesetScale / preScale / postScalesx, sy, px, pyDayanak noktası ile ölçekleme
DöndürmesetRotate / preRotate / postRotatedegrees, px, pyDayanak noktası etrafında döndürme
EğmesetSkew / preSkew / postSkewkx, kyEksenler boyunca eğme (makaslama)

Taşıma — hareket

Translate tüm noktaların konumunu belirli bir dx, dy kaydırmasıyla değiştirir. Pozitif dx sağa, dy — aşağı kaydırır (Android ekran koordinat sisteminde Y ekseni aşağıyı gösterir). Translate nesnenin şeklini değiştirmez — yalnızca konumunu. Bu, öğeleri konumlandırmak için en basit ve en sık kullanılan işlemdir.

Ölçekleme — boyut değiştirme

Scale bir nesnenin boyutunu sx (X boyunca) ve sy (Y boyunca) katsayılarıyla değiştirir. px, py parametreleri ölçekleme için dayanak noktasını belirtir. px, py belirtilmezse, ölçekleme orijine (0, 0) göre yapılır. sx = sy olduğunda nesne eşit şekilde ölçeklenir. Negatif değerler yansıma oluşturur.

Döndürme — dönme

Rotate bir nesneyi dayanak noktası (px, py) etrafında belirli bir açıyla (derece cinsinden) döndürür. Pozitif derece değerleri saat yönünde dönüşe karşılık gelir (pozitif açının saat yönünün tersi olduğu iOS/macOS'un aksine). px, py ayarlanmazsa, döndürme orijin etrafında yapılır.

Eğme — eğiklik

Skew (makaslama) bir nesneyi X ekseni (kx) veya Y ekseni (ky) boyunca eğerek deforme eder. 1.0 değeri 45 derece eğer. Skew, eğiklik efektleri, söde-3D görünümler ve perspektif bozulması oluşturmak için kullanılır.

3×3 Matrisin Yapısı

Matrix, 3×3 elemanlarını 9 kayan nokta değerinden (float[9]) oluşan bir iç dizide saklar. Saklama sırası sütun-öncelikli (column-major) olup standart matematiksel gösterimle uyumludur. Tek tek elemanlara erişim sabitler aracılığıyla yapılır: Matrix.MSCALE_X, Matrix.MSKEW_Y, Matrix.MTRANS_X ve benzeri.

Matris elemanları

Matris şu şekilde düzenlenmiştir: ilk iki sütun (MSCALE_X, MSKEW_X, MSKEW_Y, MSCALE_Y) ölçekleme, döndürme ve eğmeyi yönetir. Üçüncü sütun (MTRANS_X, MTRANS_Y, MPERSP_2) taşıma ve perspektifi yönetir. Afin dönüşümler için MPERSP_0 ve MPERSP_1 0'dır ve MPERSP_2 1'dir.

Matris değerlerini almak için getValues(float[] values) kullanın; bu, 9 elemanlı bir diziyi doldurur. Ayarlamak için setValues(float[] values) kullanın. Bu, standart translate, scale, rotate ve skew yöntemlerinin ötesinde karmaşık özel dönüşümler için matrisin doğrudan manipüle edilmesine olanak tanır.

Matris türü kontrolü

Matrix mevcut durumu sınıflandırmak için çeşitli yöntemler sağlar. isIdentity() matrisin birim matris olup olmadığını kontrol eder. isAffine() yalnızca afin dönüşümler içerip içermediğini kontrol eder (MPERSP_0 = 0, MPERSP_1 = 0, MPERSP_2 = 1). Bu kontroller optimizasyon için kullanışlıdır: matris birim ise dönüşüm atlanabilir.

Matrix ile Temel İşlemler

Matrix birkaç işlem kategorisini destekler: ayarlama (set), ön-çarpma (pre), sonra-çarpma (post), birleştirme (concat), tersine çevirme (invert) ve haritalama (map). Her kategori, karmaşık dönüşümler oluştururken kendi amacına hizmet eder.

Pre ve Post İşlemleri

preTranslate geçerli matrisi soldan taşıma matrisiyle çarpar: result = translate × current. postTranslate sağdan çarpar: result = current × translate. Fark uygulama sırasındadır: pre işlemleri geçerli dönüşümlerden önce, post işlemleri sonra uygulanır. Aynı şey preScale, postScale, preRotate, postRotate ve preSkew, postSkew için de geçerlidir.

Tersine çevirme ve birleştirme

invert(Matrix inverse) ters matrisi hesaplar. Orijinal matris tekil ise (determinant sıfır), false döndürür. concat(Matrix other) geçerli matrisi verilen matrisle çarpar: set = set × other. Ters sıra için setConcat(other, this) kullanın.

Map — noktalara ve dikdörtgenlere uygulama

mapRect(RectF rect) bir dikdörtgeni dönüştürür ve sonucu yeni bir RectF'de döndürür. mapPoints(float[] dst, float[] src) bir nokta dizisini dönüştürür. mapVectors(float[] dst, float[] src) vektörleri dönüştürür — taşımayı hesaba katmadan. mapRect, dönüşümden sonra sınırlama kutularını hesaplamak için kullanışlıdır.

Canvas ve Bitmap'te Uygulama

Matrix, iki temel Android grafik senaryosunda aktif olarak kullanılır: Canvas dönüşümü ve Bitmap dönüşümü. Her iki durumda da Matrix, grafik çıktısının nasıl değiştirileceğini belirler.

Matrix aracılığıyla Canvas dönüşümü

Canvas, geçerli matrisin tamamen değiştirilmesi için canvas.setMatrix(matrix) ve geçerli dönüşümün verilen matrisle çarpılması için canvas.concat(matrix) sağlar. Matrix uygulandıktan sonra, sonraki tüm çizimler — drawBitmap, drawRect, drawPath çağrıları — dönüştürülmüş koordinat sisteminde gerçekleştirilir. Canvas ayrıca save() ve restore() aracılığıyla kendi kaydedilmiş durum yığınını korur.

Matrix aracılığıyla Bitmap dönüşümü

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter) belirtilen dönüşüm uygulanmış yeni bir Bitmap oluşturur. Bu, orijinal Bitmap'i kaybetmeden ölçeklenmiş, döndürülmüş veya bozulmuş görüntü kopyaları oluşturmak için güçlü bir araçtır. filter parametresi, piksel enterpolasyonu sırasında kenar yumuşatmayı kontrol eder.

setPolyToPoly — perspektif dönüşümleri

setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) — CGAffineTransform'da doğrudan karşılığı olmayan, Matrix'in benzersiz bir yeteneğidir. Verilen noktaları bir çokgenden diğerine dönüştüren bir matris hesaplar. pointCount = 4 ile, perspektif bozulmasıyla Bitmap katmanlamasına izin veren tam bir perspektif (projektif) dönüşüm oluşturulur.

Kotlin Kod Örnekleri

Kotlin ile bir Android uygulamasında grafik dönüşümü için Matrix kullanımının pratik örneklerine bakalım.

Temel afin dönüşümler

Örnek, birleşik bir dönüşüm için bir Matrix oluşturur: (100, 50) kadar taşıma, 1.5x ölçekleme ve 45 derece döndürme. preRotate ve preScale'den sonra postTranslate kullanımı, işlemlerin uygulama sırasını değiştirir.

kotlin
val matrix = Matrix()
matrix.preScale(1.5f, 1.5f)
matrix.preRotate(45f)
matrix.postTranslate(100f, 50f)

// Noktalara uygulama
val pts = floatArrayOf(0f, 0f, 100f, 100f)
matrix.mapPoints(pts)

// Dikdörtgene uygulama
val rect = RectF(0f, 0f, 200f, 100f)
matrix.mapRect(rect)

save ve restore ile Canvas dönüşümü

Örnek, bir daireyi merkezi etrafında döndürmek ve ölçeklemek için onDraw'da Canvas'a Matrix uygulamasını gösterir. Canvas durumunu kaydetmek ve geri yüklemek, dönüşümün sonraki çizim öğelerini etkilememesini sağlar.

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 ile perspektif bozulması

Örnek, bir Bitmap'in perspektif bozulmasını oluşturmak için setPolyToPoly kullanır. Dört kaynak noktası (orijinal dikdörtgenin köşeleri), bir yamuk oluşturan dört hedef noktasına eşlenir. Sonuç, uzayda eğik bir görüntü efektidir.

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

Sıkça Sorulan Sorular

Android'de Matrix ve Camera arasındaki fark nedir?

Matrix, tek bir 3×3 matris aracılığıyla iki boyutlu afin ve perspektif dönüşümlerle çalışır. Camera (android.graphics.Camera), üç boyutlu bir kamerayı simüle eden daha üst düzey bir sınıftır: 3D dönüş oluşturur ve sonucu 2D Matrix'e yansıtır. Camera dahili olarak Matrix kullanır.

Bitmap 90 derece nasıl döndürülür?

postRotate(90f) ile bir Matrix oluşturun ve Bitmap.createBitmap(original, 0, 0, w, h, matrix, true) öğesine iletin. 90 derece döndürürken sonucun genişlik ve yüksekliği yer değiştirir. Rastgele bir açı1a döndürme için boş alanları önlemek amacıyla kırpmak gerekebilir.

Matrix'in ters dönüşümü nasıl alınır?

matrix.invert(resultMatrix) kullanın. Yöntem, tersine çevirme başarılı olursa true döndürür ve ters matrisi resultMatrix'e yazar. Matris tekil ise (örneğin sıfır ölçekte) tersine çevirme imkansız olabilir. Dönüş değerini her zaman kontrol edin.

pre ve post işlemleri arasındaki fark nedir?

pre yeni dönüşümü soldan çarpar: result = operation × current — işlem mevcut olanlardan önce uygulanır. post sağdan çarpar: result = current × operation — işlem sonra uygulanır. preRotate + postTranslate dizisi için: önce döndürme, sonra taşıma.

Compose'da Matrix kullanılabilir mi?

Evet, Matrix, Jetpack Compose'da Canvas Compose ile etkileşimde android.graphics.Matrix sınıfı aracılığıyla kullanılır. Compose'da dönüşümler (scale, rotationX, translationX ve diğerleri) için graphicsLayer mevcuttur, ancak karmaşık Bitmap dönüşümleri için drawWithContent veya drawBehind kodunda Matrix kullanılır.

Özet

  • Matrix — 3×3 matris ile afin ve perspektif dönüşümler için Android sınıfı
  • Dört temel tür: translate, scale, rotate, skew
  • pre/post işlemleri uygulama sırasını kontrol eder: pre — mevcut olanlardan önce, post — mevcut dönüşümlerden sonra
  • setPolyToPoly — 4 nokta çiftinden perspektif dönüşümü hesaplamak için benzersiz işlev
  • Matrix Canvas'a concat ile, Bitmap'e Matrix ile createBitmap ile, noktalara mapPoints ile uygulanır
  • invert ters dönüşümü hesaplar, tekil matrisler için false döndürür
  • isAffine ve isIdentity optimizasyon için matris durumunu sınıflandırmaya yardımcı olur

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun