اینڈروئڈ میں Matrix: یہ کیا ہے، مطروس کی اقسام اور تبدیلوں کے ساتھ کام

مصنف: IT Sectr اشاعت: 2026-07-22 مطالعے کا وقت: 9 منٹ

میٹرکس — Android SDK (android.graphics.Matrix) کا ایک کلاس ہے جو 3×3 مطروس کے ذریعے افائن تبدیل کی نمائندگی کرتا ہے۔ یہ گرافیک آبجیکٹس کو بدلنے کے لیے استعمال ہوتا ہے — حرکت دینا، حجم بدلنا، گھومانا اور جھکانا۔ Android Developers Documentation (2026) کے مطابق، Matrix Canvas، Bitmap اور Drawable میں تبدیلوں کے ساتھ کام کرنے کا بنیادی اوزار ہے، جو کسٹم ڈرائینگ میں عینی مکانات کا نگران فراہم کرتا ہے۔

اہم نکات

  • میٹرکس — 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 افائن تبدیلوں کی چار بنیادی اقسام کو سپورٹ کرتا ہے: 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 محور (kx) یا Y محور (ky) کے ساتھ جھکا کر بدل دیتا ہے۔ 1.0 کی اقدار 45 ڈگری جھکاتی ہے۔ Skew جھکاو کے اثرات، نقلی 3D ظاہرے اور نظریے بیرونی بنانے کے لیے استعمال ہوتا ہے۔

3×3 مطروس کی ساخت

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 کے ساتھ بنیادی آپریشنز

Matrix آپریشنز کی کئی قسموں کو سپورٹ کرتا ہے: معین کرنا (set)، پیش ضرب (pre)، بعد ضرب (post)، ملانا (concat)، الٹا کرنا (invert) اور نقشہ سازی (map)۔ ہر قسم پیچیدہ تبدیلیں بناتے وقت اپنے مقصد کی تکمیل کرتی ہے۔

Pre اور Post آپریشنز

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) استعمال کریں۔

Map — نقاط اور مستطیلات پر لاگو کرنا

mapRect(RectF rect) ایک مستطیل کو بدلتا ہے اور نتیجہ ایک نئے RectF میں واپس کرتا ہے۔ mapPoints(float[] dst, float[] src) نقاط کے ایک ایرے کو بدلتا ہے۔ mapVectors(float[] dst, float[] src) ویکٹرز کو بدلتا ہے — حرکت کو مدنظر نہ رکھتے ہوئ۔ mapRect تبدیل کے بعد باؤنڈنگ باکس کا حساب لگانے کے لیے مفید ہے۔

Canvas اور Bitmap میں استعمال

Matrix Android گرافکس کے دو اہم مناظروں میں فعالیت سے استعمال ہوتا ہے: 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) — CGAffineTransform میں جس کا کوئی براہراست متبادل نہیں ہے، Matrix کی ایک منفرد صلاحیت ہے۔ یہ دیے گئے نقاط کو ایک کثیرالاضلاع سے دوسرے میں بدلنے والا مطروس حاصل کرتا ہے۔ 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 کی نظریے بیرونی بنانے کے لیے۔ چار مبادی نقاط (اصلی مستطیل کے کونے) چار ہدفی نقاط پر منقول کیے جاتے ہیں جو ایک زونہ دار بناتے ہیں۔ نتیجہ خلا میں ایک جھکی ہوئی تصویر کا اثر ہے۔

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 ایک واحد 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 تبدیلوں کے لیے drawWithContent یا drawBehind کوڈ میں Matrix استعمال کیا جاتا ہے۔

خلاصہ

  • Matrix — 3×3 مطروس کے ساتھ افائن اور نظریے تبدیلوں کے لیے Android کلاس
  • چار بنیادی اقسام: translate، scale، rotate، skew
  • pre/post آپریشنز لاگو کرنے کی ترتیب کو کابو کرتے ہیں: pre — موجودہ سے پہلے، post — موجودہ تبدیلوں کے بعد
  • setPolyToPoly — 4 نقاطی جوڑوں سے نظریے تبدیل کا حساب لگانے کا منفرد فنکشن
  • Matrix Canvas پر concat سے، Bitmap پر Matrix کے ساتھ createBitmap سے، نقاط پر mapPoints سے لاگو کیا جاتا ہے
  • invert الٹی تبدیل کا حساب لگاتا ہے، واحد مطروسات کے لیے false واپس کرتا ہے
  • isAffine اور isIdentity بہترینکردگی کے لیے مطروس کی حالت کو درجہ بند کرنے میں مدد کرتے ہیں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں