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 (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ö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.
| İşlem | Yöntem | Parametreler | Açıklama |
|---|---|---|---|
| Taşıma | setTranslate / preTranslate / postTranslate | dx, dy | X ve Y eksenleri boyunca kaydırma |
| Ölçekleme | setScale / preScale / postScale | sx, sy, px, py | Dayanak noktası ile ölçekleme |
| Döndürme | setRotate / preRotate / postRotate | degrees, px, py | Dayanak noktası etrafında döndürme |
| Eğme | setSkew / preSkew / postSkew | kx, ky | Eksenler boyunca eğme (makaslama) |
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.
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.
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.
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.
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 ş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.
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 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.
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.
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.
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.
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.
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.
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(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 ile bir Android uygulamasında grafik dönüşümü için Matrix kullanımının pratik örneklerine bakalım.
Ö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.
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)
Ö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.
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()
}
Ö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.
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
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.
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.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 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.
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
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.
Ayrıca okuyun