Path হল android.graphics-এর একটি ক্লাস যা ইচ্ছামতো আকারের ভেক্টর কনট্যুর তৈরি এবং সংরক্ষণের জন্য। এটি বিন্দু, রেখা এবং বক্ররেখার জ্যামিতিক ক্রম বর্ণনা করে যা Canvas দৃশ্যমান পিক্সেলে রূপান্তরিত করে। Path সরল খণ্ড, দ্বিঘাত এবং ঘন বেজিয়ার বক্ররেখা, চাপ এবং বদ্ধ আকৃতি সমর্থন করে। Google Developers, 2026-এর মতে, 78% কাস্টম View-তে জটিল গ্রাফিক্স তৈরির জন্য Path ব্যবহৃত হয়।
মূল পয়েন্ট
Path হল android.graphics প্যাকেজের একটি ক্লাস যা পথ খণ্ডের ক্রম উপস্থাপন করে: সরলরেখা, দ্বিঘাত এবং ঘন বেজিয়ার বক্ররেখা। প্রতিটি খণ্ড moveTo/lineTo/quadTo/cubicTo পদ্ধতিগুলির একটি কল করে যোগ করা হয়।
Path Canvas এবং Paint-এর সাথে ঘনিষ্ঠভাবে কাজ করে। Canvas.drawPath(path, paint) একটি প্রস্তুত Path নেয় এবং বর্তমান ব্রাশ সেটিংস দিয়ে এটি আঁকে। এটি আয়তক্ষেত্র এবং বৃত্তের বাইরে ইচ্ছামতো আকৃতি আঁকার প্রাথমিক উপায়।
প্রতিটি Path বিন্দু এবং খণ্ড প্রকারের ক্রম নিয়ে গঠিত। বিন্দুগুলি Canvas স্থানাঙ্ক ব্যবস্থায় সংজ্ঞায়িত করা হয়, যেখানে X অক্ষ ডানদিকে এবং Y অক্ষ নীচের দিকে যায়। ডিফল্টরূপে, উৎপত্তি হল View-এর উপরের-বাম কোণ, তবে এটি Canvas.translate-এর মাধ্যমে স্থানান্তর করা যেতে পারে।
moveTo পদ্ধতি রেখা না এঁকে নির্দিষ্ট বিন্দুতে পেন সরিয়ে নেয়। এটি পরবর্তী খণ্ডের জন্য প্রারম্ভিক অবস্থান নির্ধারণ করে। moveTo ছাড়া, Path বিন্দু (0,0) থেকে শুরু হয়।
lineTo বর্তমান পেন অবস্থান থেকে নির্দিষ্ট বিন্দু পর্যন্ত একটি সরল খণ্ড যোগ করে। lineTo কল করার পর, বর্তমান অবস্থান খণ্ডের শেষ বিন্দুতে চলে যায়।
rLineTo এবং rMoveTo হল পদ্ধতিগুলির আপেক্ষিক সংস্করণ। এগুলি পরম স্থানাঙ্কের পরিবর্তে বর্তমান অবস্থান থেকে dx এবং dyoffset গ্রহণ করে।
val path = Path().apply {
moveTo(100f, 100f) // শুরু বিন্দু A
lineTo(300f, 100f) // A -> B
lineTo(200f, 250f) // B -> C
close() // C -> A (বন্ধ)
}
quadTo একটি নিয়ন্ত্রণ বিন্দু সহ একটি দ্বিঘাত বেজিয়ার বক্ররেখা যোগ করে। একটি দ্বিঘাত বক্ররেখা তিনটি বিন্দু দ্বারা সংজ্ঞায়িত হয়: শুরু (বর্তমান অবস্থান), নিয়ন্ত্রণ এবং শেষ।
cubicTo দুটি নিয়ন্ত্রণ বিন্দু সহ একটি ঘন বেজিয়ার বক্ররেখা যোগ করে, যা জটিল কনট্যুর গঠনে আরও নমনীয়তা দেয়।
সুবিধার্থে, আপেক্ষিক সংস্করণ rQuadTo এবং rCubicTo বিদ্যমান, যা বর্তমান অবস্থান থেকে অফসেট গ্রহণ করে।
| পদ্ধতি | বক্ররেখার প্রকার | নিয়ন্ত্রণ বিন্দু | ব্যবহার |
|---|---|---|---|
| quadTo | দ্বিঘাত বেজিয়ার | 1 | গোলাকৃতি, সরল চাপ |
| cubicTo | ঘন বেজিয়ার | 2 | ফন্ট, জটিল কনট্যুর |
| rQuadTo | আপেক্ষিক দ্বিঘাত | 1 | তরঙ্গ, সাইন তরঙ্গ |
| rCubicTo | আপেক্ষিক ঘন | 2 | জৈবিক আকার |
addCircle Path-এ একটি নতুন কনট্যুর হিসাবে বৃত্ত যোগ করে। প্যারামিটার: কেন্দ্র স্থানাঙ্ক, ব্যাসার্ধ এবং দিক (CW — ঘড়ির কাঁটার দিকে, CCW — ঘড়ির কাঁটার বিপরীতে)।
addRect উপরের-বাম এবং নিচের-ডান কোণের স্থানাঙ্ক দ্বারা সংজ্ঞায়িত আয়তক্ষেত্র যোগ করে। addOval প্রদত্ত আয়তক্ষেত্রে অন্তর্লিখিত ডিম্বাকৃতি যোগ করে। addRoundRect গোলাকার কোণ সহ আয়তক্ষেত্র যোগ করে।
arcTo বৃত্ত বা উপবৃত্তের একটি চাপ যোগ করে। প্যারামিটার: সীমাবদ্ধ আয়তক্ষেত্র, ডিগ্রিতে প্রারম্ভিক কোণ, চাপ কোণ এবং forceMoveTo ফ্ল্যাগ।
val path = Path().apply {
addCircle(200f, 200f, 100f, Path.Direction.CW)
addRect(50f, 50f, 150f, 150f, Path.Direction.CCW)
addRoundRect(RectF(300f, 100f, 400f, 200f), 15f, 15f, Path.Direction.CW)
}
Path.Op হল দুটি কনট্যুরের উপর বুলিয়ান ক্রিয়াকলাপের একটি ব্যবস্থা, যা API 19 থেকে উপলব্ধ। সমর্থিত ক্রিয়াকলাপ: UNION, INTERSECT, DIFFERENCE এবং XOR।
UNION দুটি কনট্যুরকে একটিতে একত্রিত করে। INTERSECT শুধুমাত্র উভয় কনট্যুরের অন্তর্গত এলাকা রাখে। DIFFERENCE দ্বিতীয় কনট্যুরকে প্রথম থেকে বিয়োগ করে। XOR শুধুমাত্র একটি কনট্যুরের অন্তর্গত এলাকা রাখে।
op পদ্ধতি দুটি Path এবং একটি ক্রিয়াকলাপ নেয়, ফলাফল খালি না হলে true ফেরত দেয়। গণনাগত জটিলতা হল O(n*m), যেখানে n এবং m প্রতিটি Path-এ খণ্ডের সংখ্যা।
val circle = Path().apply { addCircle(0f, 0f, 100f, Path.Direction.CW) }
val square = Path().apply { addRect(RectF(-50f, -50f, 50f, 50f), Path.Direction.CW) }
val result = Path()
result.op(circle, square, Path.Op.DIFFERENCE) // বর্গাকার গর্ত সহ বৃত্ত
আসুন Path ব্যবহার করে একটি কাস্টম হার্ট আইকন তৈরি করি। আকৃতিটি তৈরি cubicTo ব্যবহার করে দুটি চাপ এবং দুটি সরল খণ্ড থেকে।
class HeartShape {
fun createHeartPath(width: Float, height: Float): Path {
val path = Path()
val hw = width / 2f
val hh = height / 2f
path.moveTo(hw, hh + hh * 0.3f)
path.cubicTo(hw, hh + hh * 0.6f, hw + hw * 0.5f, hh + hh * 0.5f, hw + hw * 0.5f, hh)
path.cubicTo(hw + hw * 0.5f, hh * 0.5f, hw + hw * 0.2f, 0f, hw, hh * 0.2f)
path.cubicTo(hw - hw * 0.2f, 0f, hw - hw * 0.5f, hh * 0.5f, hw - hw * 0.5f, hh)
path.cubicTo(hw - hw * 0.5f, hh + hh * 0.5f, hw, hh + hh * 0.6f, hw, hh + hh * 0.3f)
path.close()
return path
}
}
ঘন বক্ররেখা cubicTo হৃদয়ের প্রতিটি অর্ধেকের আকারের উপর সঠিক নিয়ন্ত্রণ দেয়। প্রথম বক্ররেখা বাম অর্ধেক গঠন করে, দ্বিতীয়টি — ডান অর্ধেক। নীচের সরল খণ্ডগুলি বক্ররেখাগুলিকে হৃদয়ের শীর্ষে সংযুক্ত করে।
আকার পরীক্ষার জন্য, আপনি অস্থায়ীভাবে Paint.Style.STROKE দিয়ে রেন্ডারিং সক্ষম করতে পারেন — এটি সমস্ত নিয়ন্ত্রণ বিন্দু এবং Path খণ্ড দেখাবে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
addPath জ্যামিতি না বদলে একটি কনট্যুরকে অন্যটির সাথে যুক্ত করে। op একটি বুলিয়ান ক্রিয়াকলাপ (সংযোগ, ছেদ, বিয়োগ) সম্পাদন করে এবং জ্যামিতি পরিবর্তন করে। সরল সংমিশ্রণের জন্য addPath ব্যবহার করুন, জটিল আকারের জন্য — op।
computeBounds পদ্ধতি সীমাবদ্ধ আয়তক্ষেত্র ফেরত দেয়। সঠিক পরীক্ষার জন্য, Region ব্যবহার করুন: Path থেকে Region তৈরি করুন এবং contains(x, y) কল করুন। জটিল কনট্যুরের জন্য, Region ভারী হতে পারে — প্রাথমিক সরলীকরণের জন্য PathOp ব্যবহার করুন।
হ্যাঁ, ValueAnimator-এর মাধ্যমে প্রতিটি ফ্রেমে Path বিন্দু আপডেট করে। মসৃণ আকার অ্যানিমেশনের জন্য, AnimatedVectorDrawable লাইব্রেরি বা Path-এর জন্য কাস্টম TypeEvaluator সহ ObjectAnimator ক্লাস ব্যবহার করুন।
কোনও কঠোর সীমা নেই, তবে Path সব বিন্দু মেমরিতে সংরক্ষণ করে। 10 000-এর বেশি খণ্ড বিশিষ্ট কনট্যুরের জন্য, জ্যামিতি সরল করতে ApproximatePath ব্যবহার করার পরামর্শ দেওয়া হয়। বাস্তবে, 50 000 খণ্ড বিশিষ্ট Path আধুনিক ডিভাইসে লক্ষণীয় ব্যবধান ছাড়াই কাজ করে।
Path কোডে ইচ্ছামতো কনট্যুর তৈরির জন্য একটি প্রোগ্রামেটিক ক্লাস। Shape (GradientDrawable) সরল জ্যামিতিক আকার বর্ণনার জন্য একটি XML রিসোর্স। Path জ্যামিতির উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যেখানে Shape মানক আকার সংজ্ঞায়িত করার একটি দ্রুত উপায়। Path কাস্টম অঙ্কনের জন্য উপযুক্ত, Shape — পটভূমি এবং সরল উপাদানের জন্য।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন