Matrix — Android SDK-dan (android.graphics.Matrix) 3×3 matrisi vasitəsilə affin çevrilməsini təmsil edən sinifdir. O, qrafik obyektlərin transformasiyası üçün istifadə olunur — yerdəyişmə, miqyaslama, fırlatma və əyilmə. Android Developers Documentation (2026) məlumatına görə, Matrix Canvas, Bitmap və Drawable-də transformasiyalarla işləmək üçün əsas vasitədir və xüsusi çəkmə zamanı koordinatların dəqiq idarə edilməsini təmin edir.
Əsas məqamlar
Matrix (android.graphics.Matrix) — ikiölçülü koordinatların transformasiyası üçün istifadə olunan 3×3 riyazi matrisi təmsil edən Android SDK sinifidir. Matrix Android-də bütün qrafik çevrilmələri üçün əsas tikinti blokudur — Canvas-ın yerdəyişməsi və miqyaslanmasından tutmuş Bitmap-ın mürəkkəb perspektiv deformasiyalarına qədər.
iOS-dan fərqli olaraq, burada ayrıca CGAffineTransform (affin) və CATransform3D (3D) strukturları istifadə olunur, Android affin və perspektiv çevrilmələri bir Matrix sinfində birləşdirir. 3×3 matrisi həm standart affin əməliyyatlarını (son sətir [0, 0, 1]), həm də son sətirdə ixtiyari dəyərlər olduqda perspektiv deformasiyaları təmsil etməyə imkan verir. Bu daha çox çeviklik verir, lakin matris riyaziyyatını başa düşməyi tələb edir.
Matrix Canvas API ilə sıx inteqrasiya olunub. Proqramçı canvas.translate(), canvas.scale() və ya canvas.rotate() çağırdıqda, bu metodlar daxili olaraq qrafik kontekstinin matrisini dəyişdirir. Canvas-ın cari matrisini canvas.getMatrix() vasitəsilə əldə etmək, xüsusi matrisi isə canvas.setMatrix() və ya canvas.concat() vasitəsilə əl ilə tətbiq etmək olar.
Matrix dörd əsas affin çevrilmə növünü dəstəkləyir: translate, scale, rotate, skew (əyilmə). Hər növün pre-vurma (pre), post-vurma (post) və təyin etmə (set) metodları var. preTranslate və postTranslate arasındakı fərq matrislərin vurulma ardıcıllığındadır ki, bu da birləşdirildikdə yekun çevrilməyə təsir edir.
| Əməliyyat | Metod | Parametrlər | Təsvir |
|---|---|---|---|
| Translate | setTranslate / preTranslate / postTranslate | dx, dy | X və Y oxları üzrə yerdəyişmə |
| Scale | setScale / preScale / postScale | sx, sy, px, py | İstinad nöqtəsi ilə miqyaslama |
| Rotate | setRotate / preRotate / postRotate | degrees, px, py | İstinad nöqtəsi ətrafında fırlanma |
| Skew | setSkew / preSkew / postSkew | kx, ky | Oxlar boyunca əyilmə (sürüşmə) |
Translate bütün nöqtələrin vəziyyətini verilmiş dx, dy yerdəyişməsi qədər dəyişir. Müsbət dx sağa, dy — aşağı yerdəyişdirir (Android ekran koordinat sistemində Y oxu aşağı yönəlib). Translate obyektin formasını dəyişmir — yalnız onun mövqeyini. Elementlərin yerləşdirilməsi üçün ən sadə və ən çox istifadə olunan əməliyyatdır.
Scale obyektin ölçüsünü sx (X üzrə) və sy (Y üzrə) əmsalları ilə dəyişir. px, py parametrləri miqyaslama istinad nöqtəsini (pivot point) təyin edir. px, py göstərilməzsə, miqyaslama koordinat başlanğıcına (0, 0) nisbətən yerinə yetirilir. sx = sy olduqda obyekt bərabər miqyaslanır. Mənfi dəyərlər əks etdirmə yaradır.
Rotate obyekti istinad nöqtəsi (px, py) ətrafında verilmiş bucaq qədər (dərəcə ilə) fırladır. Müsbət dərəcə dəyəri saat əqrəbi istiqamətində fırlanmaya uyğundur (iOS/macOS-dən fərqli olaraq, burada müsbət bucaq saat əqrəbinin əksinədir). px, py göstərilməzsə, fırlanma koordinat başlanğıcı ətrafında yerinə yetirilir.
Skew (sürüşmə) obyekti deformasiya edərək, onu X oxu (kx) və ya Y oxu (ky) boyunca əyir. 1.0 dəyəri 45 dərəcə əyir. Skew əyilmə effektləri yaratmaq, üçölçülü görünüşü (pseudo-3D) təqlid etmək və perspektiv deformasiyası üçün istifadə olunur.
Matrix 3×3 matrisinin elementlərini daxili 9 üzən nöqtəli dəyər massivində (float[9]) saxlayır. Saxlama qaydası — column-major (sütunlar üzrə), standart riyazi təqdimata uyğundur. Ayrı-ayrı elementlərə giriş sabitlər vasitəsilə həyata keçirilir: Matrix.MSCALE_X, Matrix.MSKEW_Y, Matrix.MTRANS_X və s.
Matris aşağıdakı kimi təşkil olunub: ilk iki sütun (MSCALE_X, MSKEW_X, MSKEW_Y, MSCALE_Y) miqyaslama, fırlanma və əyilməyə cavabdehdir. Üçüncü sütun (MTRANS_X, MTRANS_Y, MPERSP_2) — yerdəyişmə və perspektiv üçün. Affin çevrilməsi üçün MPERSP_0 və MPERSP_1 0-a, MPERSP_2 isə 1-ə bərabərdir.
Matrisin dəyərlərini əldə etmək üçün getValues(float[] values) istifadə olunur, bu da 9 elementli massivi doldurur. Təyin etmək üçün — setValues(float[] values). Bu, translate, scale, rotate və skew standart metodlarından kənara çıxan mürəkkəb xüsusi çevrilmələr üçün matrisi birbaşa idarə etməyə imkan verir.
Matrix cari vəziyyəti təsnif etmək üçün bir neçə metod təqdim edir. isIdentity() matrisin vahid olub-olmadığını yoxlayır. isAffine() — yalnız affin çevrilmələri ehtiva edib-etmədiyini (MPERSP_0 = 0, MPERSP_1 = 0, MPERSP_2 = 1). Bu yoxlamalar optimallaşdırma üçün faydalıdır: matris vahiddirsə, transformasiya buraxıla bilər.
Matrix bir neçə əməliyyat kateqoriyasını dəstəkləyir: təyin etmə (set), pre-vurma (pre), post-vurma (post), birləşdirmə (concat), inversiya (invert) və xəritələmə (map). Hər kateqoriya mürəkkəb çevrilmələr qurarkən öz vəzifəsini həll edir.
preTranslate cari matrisi soldan yerdəyişmə matrisinə vurur: result = translate × current. postTranslate sağdan vurur: result = current × translate. Fərq tətbiq ardıcıllığındadır: pre-əməliyyatlar cari transformasiyalardan əvvəl, post-əməliyyatlar isə sonra tətbiq olunur. preScale, postScale, preRotate, postRotate və preSkew, postSkew də analoji işləyir.
invert(Matrix inverse) tərs matrisi hesablayır. Mənbə matrisi degenerativdirsə (determinant sıfıra bərabərdir), false qaytarılır. concat(Matrix other) cari matrisi verilmiş matrisə vurur: set = set × other. Əks ardıcıllıq üçün setConcat(other, this) istifadə edin.
mapRect(RectF rect) düzbucaqlını çevirir və nəticəni yeni RectF-də qaytarır. mapPoints(float[] dst, float[] src) nöqtələr massivini çevirir. mapVectors(float[] dst, float[] src) vektorları çevirir — yerdəyişmə (translate) nəzərə alınmadan. mapRect transformasiyadan sonra bounding box hesablamaq üçün faydalıdır.
Matrix Android qrafikasının iki əsas ssenarisində fəal istifadə olunur: Canvas transformasiyası və Bitmap transformasiyası. Hər iki halda Matrix qrafik nəticənin necə dəyişəcəyini müəyyən edir.
Canvas cari matrisi tam dəyişdirmək üçün canvas.setMatrix(matrix) və cari çevrilməni verilənə vurmaq üçün canvas.concat(matrix) metodlarını təqdim edir. Matrix tətbiq edildikdən sonra bütün sonrakı çəkmə — drawBitmap, drawRect, drawPath çağırışları — çevrilmiş koordinat sistemində yerinə yetirilir. Canvas həmçinin save() və restore() vasitəsilə öz saxlanmış vəziyyətlər yığınını saxlayır.
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter) verilmiş çevrilməni tətbiq etməklə yeni Bitmap yaradır. Bu, orijinal Bitmap-ı itirmədən miqyaslanmış, fırladılmış və ya deformasiya edilmiş şəkil surətləri yaratmaq üçün güclü vasitədir. filter parametri piksel interpolasiyası zamanı hamarlaşmanı idarə edir.
setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) — CGAffineTransform-da birbaşa analoqu olmayan Matrix-in unikal imkanıdır. Verilmiş nöqtələri bir çoxbucaqlıdan digərinə çevirən matrisi hesablayır. pointCount = 4 olduqda, perspektiv deformasiyası ilə Bitmap tətbiq etməyə imkan verən tam perspektiv (projective) çevrilmə yaradılır.
Praktik nümunələri Kotlin-də Android proqramında qrafik transformasiyası üçün Matrix-in istifadəsini nəzərdən keçirək.
Nümunə birləşdirilmiş çevrilmə üçün Matrix yaradır: (100, 50) yerdəyişmə, 1.5 dəfə miqyaslama və 45 dərəcə fırlanma. preRotate və preScale-dən sonra postTranslate istifadəsi əməliyyatların tətbiq ardıcıllığını dəyişir.
val matrix = Matrix()
matrix.preScale(1.5f, 1.5f)
matrix.preRotate(45f)
matrix.postTranslate(100f, 50f)
// Nöqtələrə tətbiq
val pts = floatArrayOf(0f, 0f, 100f, 100f)
matrix.mapPoints(pts)
// Düzbucaqlıya tətbiq
val rect = RectF(0f, 0f, 200f, 100f)
matrix.mapRect(rect)
Nümunə dairəni mərkəzi ətrafında fırlatmaq və miqyaslamaq üçün onDraw-da Canvas-a Matrix tətbiqini nümayiş etdirir. Canvas vəziyyətinin saxlanması və bərpası transformasiyanın sonrakı çəkmə elementlərinə təsir etməməsinə zəmanət verir.
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()
}
Nümunə Bitmap-ın perspektiv deformasiyasını yaratmaq üçün setPolyToPoly istifadə edir. Dörd mənbə nöqtəsi (orijinal düzbucaqlının küncləri) trapesiya təşkil edən dörd hədəf nöqtəsinə xəritələnir. Nəticə — fəzada əyilmiş şəkil effektidir.
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
)
}
Tez-tez verilən suallar
Matrix bir 3×3 matrisi vasitəsilə ikiölçülü affin və perspektiv çevrilmələrlə işləyir. Camera (android.graphics.Camera) — üçölçülü kameranı təqlid edən daha yüksək səviyyəli sinifdir: 3D fırlanma yaradır və nəticəni 2D Matrix-ə proyeksiya edir. Camera daxili olaraq Matrix istifadə edir.
postRotate(90f) ilə Matrix yaradın və Bitmap.createBitmap(original, 0, 0, w, h, matrix, true)-yə ötürün. Nəzərə alın ki, 90 dərəcə fırlananda nəticənin eni və hündürlüyü yerlərini dəyişir. İxtiyari bucaq üçün boş sahələrdən qaçmaq üçün kəsmə tələb oluna bilər.
matrix.invert(resultMatrix) istifadə edin. Metod inversiya uğurlu olarsa true qaytarır və tərs matrisi resultMatrix-ə yazır. Matris degenerativdirsə (məsələn, sıfır miqyasda) inversiya mümkün olmaya bilər. Həmişə qaytarılan dəyəri yoxlayın.
pre yeni çevrilməni soldan vurur: result = operation × current — əməliyyat cari olanlardan əvvəl tətbiq olunur. post sağdan vurur: result = current × operation — əməliyyat sonra tətbiq olunur. preRotate + postTranslate ardıcıllığı üçün: əvvəlcə fırlanma, sonra yerdəyişmə.
Bəli, Matrix Jetpack Compose-da android.graphics.Matrix sinfi vasitəsilə Canvas Compose ilə qarşılıqlı əlaqədə istifadə olunur. Compose-da transformasiya üçün graphicsLayer (scale, rotationX, translationX və s.) mövcuddur, lakin Bitmap-ın mürəkkəb çevrilmələri üçün Matrix drawWithContent və ya drawBehind kodunda tətbiq edilir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun