Matrix — Android SDK (android.graphics.Matrix) এর একটি ক্লাস যা 3×3 ম্যাট্রিক্সের মাধ্যমে অ্যাফাইন ট্রান্সফর্মেশন উপস্থাপন করে। এটি গ্রাফিক বস্তু — স্থানান্তর, স্কেলিং, ঘোরানো এবং বাঁকানোর জন্য ব্যবহৃত হয়। Android Developers Documentation (2026) অনুযায়ী, 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.getMatrix()-এর মাধ্যমে বর্তমান Canvas ম্যাট্রিক্স পাওয়া যায় এবং 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]) একটি অভ্যন্তরীণ অ্যারেতে সংরক্ষণ করে। সংরক্ষণের ক্রম কলাম-মেজর, যা স্ট্যান্ডার্ড গাণিতিক উপস্থাপনার সাথে সামঞ্জস্যপূর্ণ। পৃথক উপাদানগুলিতে অ্যাক্সেস ধ্রুবকের মাধ্যমে সম্পাদিত হয়: 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) — Matrix-এর একটি অনন্য ক্ষমতা যার CGAffineTransform-এ কোন সরাসরি সমতুল্য নেই। এটি একটি ম্যাট্রিক্স গণনা করে যা প্রদত্ত বিন্দুগুলিকে একটি বহুভুজ থেকে অন্যটিতে রূপান্তর করে। 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()
}
উদাহরণটি একটি Bitmap-এর দৃষ্টিকোণ বিকৃতি তৈরি করতে setPolyToPoly ব্যবহার করে। চারটি উৎস বিন্দু (মূল আয়তক্ষেত্রের কোণ) চারটি লক্ষ্য বিন্দুতে ম্যাপ করা হয় যা একটি ট্রাপিজয়েড গঠন করে। ফলাফল স্থানে হেলানো ছবির প্রভাব।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন