میٹرکس — 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 افائن تبدیلوں کی چار بنیادی اقسام کو سپورٹ کرتا ہے: 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 محور (kx) یا Y محور (ky) کے ساتھ جھکا کر بدل دیتا ہے۔ 1.0 کی اقدار 45 ڈگری جھکاتی ہے۔ Skew جھکاو کے اثرات، نقلی 3D ظاہرے اور نظریے بیرونی بنانے کے لیے استعمال ہوتا ہے۔
Matrix اپنے 3×3 عناصر کو 9 عشائمی نقاط کی اقداروں (float[9]) کے اندرونی ایرے میں محفوظ کرتا ہے۔ ذخیرہ کا ترتیب کالم میجر (column-major) ہے، جو معیاری ریاضی نمائندگی سے مطابق ہے۔ انفرادی عناصر تک رسائی مساتل میں سے ہوتی ہے: Matrix.MSCALE_X، Matrix.MSKEW_Y، Matrix.MTRANS_X و غیرہ۔
مطروس کو اس طرح منتظم کیا گیا ہے: پہلے دو کالم (MSCALE_X، MSKEW_X، MSKEW_Y، MSCALE_Y) حجم بدلنے، گھومانے اور جھکانے کا انتظام کرتے ہیں۔ تیسرا کالم (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 گرافکس کے دو اہم مناظروں میں فعالیت سے استعمال ہوتا ہے: 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) — CGAffineTransform میں جس کا کوئی براہراست متبادل نہیں ہے، Matrix کی ایک منفرد صلاحیت ہے۔ یہ دیے گئے نقاط کو ایک کثیرالاضلاع سے دوسرے میں بدلنے والا مطروس حاصل کرتا ہے۔ 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 کی نظریے بیرونی بنانے کے لیے۔ چار مبادی نقاط (اصلی مستطیل کے کونے) چار ہدفی نقاط پر منقول کیے جاتے ہیں جو ایک زونہ دار بناتے ہیں۔ نتیجہ خلا میں ایک جھکی ہوئی تصویر کا اثر ہے۔
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 ایک واحد 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں