ক্যানভাস অবজেক্ট ক্লিপিং

এই কোডল্যাবটি অ্যাডভান্সড অ্যান্ড্রয়েড ইন কোটলিন কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন, তবে এটি বাধ্যতামূলক নয়৷ সমস্ত কোর্স কোডল্যাবগুলি কোটলিন কোডল্যাবস ল্যান্ডিং পৃষ্ঠায় অ্যাডভান্সড অ্যান্ড্রয়েডে তালিকাভুক্ত করা হয়েছে।

ভূমিকা

এই কোডল্যাবের উদ্দেশ্যে, ক্লিপিং হল একটি চিত্র, ক্যানভাস বা বিটম্যাপের অঞ্চলগুলিকে সংজ্ঞায়িত করার একটি উপায় যা বেছে বেছে আঁকা বা স্ক্রিনে আঁকা হয় না। ক্লিপিংয়ের একটি উদ্দেশ্য হল ওভারড্র কম করা। ওভারড্র হল যখন স্ক্রিনে একটি পিক্সেল চূড়ান্ত চিত্র প্রদর্শনের জন্য একাধিকবার আঁকা হয়। আপনি যখন ওভারড্র কম করেন, তখন আপনি অঙ্কন কার্যক্ষমতা সর্বাধিক করার জন্য প্রদর্শনের একটি পিক্সেল বা অঞ্চল আঁকার সংখ্যা কমিয়ে দেন। আপনি ব্যবহারকারী ইন্টারফেস ডিজাইন এবং অ্যানিমেশনে আকর্ষণীয় প্রভাব তৈরি করতে ক্লিপিং ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ, আপনি যখন নিচের চিত্রের মতো ওভারল্যাপিং কার্ডের একটি স্তুপ আঁকেন, প্রতিটি কার্ডকে নিচ থেকে সম্পূর্ণরূপে আঁকার পরিবর্তে, শুধুমাত্র দৃশ্যমান অংশগুলি আঁকতে এটি সাধারণত আরও কার্যকর। "সাধারণত", কারণ ক্লিপিং অপারেশনেরও একটি খরচ থাকে এবং সামগ্রিকভাবে, অ্যান্ড্রয়েড সিস্টেম অনেক অঙ্কন অপ্টিমাইজেশান করে।

শুধুমাত্র কার্ডগুলির দৃশ্যমান অংশগুলি আঁকতে, আপনি প্রতিটি কার্ডের জন্য একটি ক্লিপিং অঞ্চল নির্দিষ্ট করুন৷ উদাহরণস্বরূপ নীচের চিত্রে, যখন একটি ক্লিপিং আয়তক্ষেত্র একটি ছবিতে প্রয়োগ করা হয়, শুধুমাত্র সেই আয়তক্ষেত্রের ভিতরের অংশটি প্রদর্শিত হয়।

ক্লিপিং অঞ্চলটি সাধারণত একটি আয়তক্ষেত্র, তবে এটি যেকোনো আকার বা আকারের সংমিশ্রণ, এমনকি পাঠ্যও হতে পারে। আপনি ক্লিপিং অঞ্চলের ভিতরের অঞ্চলটি অন্তর্ভুক্ত বা বাদ দিতে চান কিনা তাও আপনি নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, আপনি একটি বৃত্তাকার ক্লিপিং অঞ্চল তৈরি করতে পারেন এবং শুধুমাত্র বৃত্তের বাইরে যা আছে তা প্রদর্শন করতে পারেন।

এই কোডল্যাবে, আপনি ক্লিপিংয়ের বিভিন্ন উপায় নিয়ে পরীক্ষা করতে যাচ্ছেন।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • কীভাবে একটি Activity সহ একটি অ্যাপ তৈরি করবেন এবং অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে এটি চালাবেন।
  • কিভাবে একটি Canvas তৈরি এবং আঁকা.
  • কিভাবে একটি কাস্টম View তৈরি করবেন এবং onDraw() এবং onSizeChanged() ওভাররাইড করবেন।

আপনি কি শিখবেন

  • Canvas আঁকতে কীভাবে বস্তু ক্লিপ করবেন।
  • কিভাবে একটি ক্যানভাসের অঙ্কন অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করতে হয়।
  • একটি ক্যানভাসে এবং পাঠ্যে রূপান্তরগুলি কীভাবে প্রয়োগ করবেন।

আপনি কি করবেন

  • একটি অ্যাপ তৈরি করুন যা স্ক্রিনে ক্লিপ করা আকৃতি আঁকে যা ক্লিপিংয়ের বিভিন্ন উপায় এবং সেই আকারগুলির দৃশ্যমানতার উপর এর ফলাফল প্রদর্শন করে।
  • আপনি কিছু অনুবাদিত এবং তির্যক পাঠও আঁকবেন।

ClippingExample অ্যাপটি দেখায় যে আপনি কীভাবে একটি দৃশ্যে ক্যানভাসের কোন অংশগুলি প্রদর্শিত হবে তা নির্দিষ্ট করতে আকারগুলি ব্যবহার এবং একত্রিত করতে পারেন৷ আপনার চূড়ান্ত অ্যাপটি নিচের স্ক্রিনশটের মত দেখাবে।

আপনি স্ক্র্যাচ থেকে এই অ্যাপটি তৈরি করতে যাচ্ছেন, তাই আপনাকে একটি প্রকল্প সেট আপ করতে হবে, মাত্রা এবং স্ট্রিংগুলি সংজ্ঞায়িত করতে হবে এবং কিছু ভেরিয়েবল ঘোষণা করতে হবে।

ধাপ 1: ClippingExample প্রজেক্ট তৈরি করুন

  1. খালি কার্যকলাপ টেমপ্লেট সহ ClippingExample নামে একটি Kotlin প্রকল্প তৈরি করুন। প্যাকেজ নামের উপসর্গের জন্য com.example.android ব্যবহার করুন।
  2. MainActivity.kt খুলুন।
  3. onCreate() পদ্ধতিতে, ডিফল্ট কন্টেন্ট ভিউ প্রতিস্থাপন করুন এবং কন্টেন্ট ভিউটিকে ClippedView এর একটি নতুন উদাহরণে সেট করুন। আপনি পরবর্তীতে যে ক্লিপিং উদাহরণগুলি তৈরি করবেন তার জন্য এটি আপনার কাস্টম ভিউ হবে।
setContentView(ClippedView(this))
  1. MainActivity.kt এর মতো একই স্তরে, ClippedView নামে একটি কাস্টম ভিউয়ের জন্য একটি নতুন Kotlin ফাইল এবং ক্লাস তৈরি করুন যা View প্রসারিত করে। নিচে দেখানো স্বাক্ষরটি দিন। আপনার বাকি কাজগুলি এই ClippedView ভিতরে থাকবে। @JvmOverloads টীকাটি এই ফাংশনের জন্য ওভারলোড তৈরি করতে Kotlin কম্পাইলারকে নির্দেশ দেয় যা ডিফল্ট প্যারামিটার মান প্রতিস্থাপন করে।
class ClippedView @JvmOverloads constructor(
   context: Context,
   attrs: AttributeSet? = null,
   defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
}

ধাপ 2: মাত্রা এবং স্ট্রিং সংস্থান যোগ করুন

  1. res/values/dimens.xml এ একটি নতুন রিসোর্স ফাইলে ক্লিপ করা ভিউগুলির জন্য আপনি যে মাত্রাগুলি ব্যবহার করবেন তা সংজ্ঞায়িত করুন। এই ডিফল্ট মাত্রাগুলি হার্ডকোড করা এবং একটি সুন্দর ছোট পর্দায় মাপসই করা হয়৷
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="clipRectRight">90dp</dimen>
   <dimen name="clipRectBottom">90dp</dimen>
   <dimen name="clipRectTop">0dp</dimen>
   <dimen name="clipRectLeft">0dp</dimen>

   <dimen name="rectInset">8dp</dimen>
   <dimen name="smallRectOffset">40dp</dimen>

   <dimen name="circleRadius">30dp</dimen>
   <dimen name="textOffset">20dp</dimen>
   <dimen name="strokeWidth">4dp</dimen>

   <dimen name="textSize">18sp</dimen>
</resources>

অ্যাপটিকে একটি বড় স্ক্রিনে সুন্দর দেখাতে (এবং আরও সহজে বিশদ দেখতে), আপনি বড় মান সহ একটি dimens ফাইল তৈরি করতে পারেন যা শুধুমাত্র বড় স্ক্রিনে প্রযোজ্য।

  1. অ্যান্ড্রয়েড স্টুডিওতে, মান ফোল্ডারে ডান-ক্লিক করুন এবং নতুন > মান সম্পদ ফাইল নির্বাচন করুন।
  2. নতুন রিসোর্স ফাইল ডায়ালগে, ফাইলের dimens কল করুন। উপলভ্য কোয়ালিফায়ারে , সবচেয়ে ছোট স্ক্রীন প্রস্থ নির্বাচন করুন এবং বেছে নেওয়া কোয়ালিফায়ারে যোগ করতে >> বোতামে ক্লিক করুন। সবচেয়ে ছোট পর্দার প্রস্থ বাক্সে 480 লিখুন এবং ঠিক আছে ক্লিক করুন।

  1. ফাইলটি আপনার মান ফোল্ডারে দেখানো উচিত যেমনটি নীচে দেখানো হয়েছে।

  1. আপনি যদি ফাইলটি দেখতে না পান তবে অ্যাপটির প্রজেক্ট ফাইল ভিউতে স্যুইচ করুন। নতুন ফাইলের সম্পূর্ণ পথটি নীচে দেখানো হয়েছে: ClippingExample/app/src/main/res/values-sw480dp/dimens.xml

  1. values-sw480dp/dimens.xml ফাইলের ডিফল্ট বিষয়বস্তু নিচের মাত্রা দিয়ে প্রতিস্থাপন করুন।
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="clipRectRight">120dp</dimen>
   <dimen name="clipRectBottom">120dp</dimen>

   <dimen name="rectInset">10dp</dimen>
   <dimen name="smallRectOffset">50dp</dimen>

   <dimen name="circleRadius">40dp</dimen>
   <dimen name="textOffset">25dp</dimen>
   <dimen name="strokeWidth">6dp</dimen>
</resources>
  1. strings.xml এ, নিম্নলিখিত স্ট্রিং যোগ করুন। এগুলো ক্যানভাসে টেক্সট প্রদর্শন করতে ব্যবহার করা হবে।
<string name="clipping">Clipping</string>
<string name="translated">translated text</string>
<string name="skewed">"Skewed and "</string>

ধাপ 3: একটি পেইন্ট এবং একটি পাথ অবজেক্ট তৈরি এবং শুরু করুন

  1. আপনার প্রকল্পের Android ভিউতে ফিরে যান।
  2. ClippedView এ আঁকা একটি Paint ভেরিয়েবল সংজ্ঞায়িত করুন। অ্যান্টি-অ্যালিয়াসিং সক্ষম করুন, এবং নীচে দেখানো হিসাবে, মাত্রাগুলিতে সংজ্ঞায়িত স্ট্রোক প্রস্থ এবং পাঠ্য আকার ব্যবহার করুন।
private val paint = Paint().apply {
   // Smooth out edges of what is drawn without affecting shape.
   isAntiAlias = true
   strokeWidth = resources.getDimension(R.dimen.strokeWidth)
   textSize = resources.getDimension(R.dimen.textSize)
}
  1. ClippedView , যা আঁকা হয়েছে তার পাথ স্থানীয়ভাবে সঞ্চয় করার জন্য একটি Path তৈরি করুন এবং শুরু করুন। android.graphics.Path আমদানি করুন।
private val path = Path()

ধাপ 4: আকার সেট আপ করুন

এই অ্যাপটিতে, আপনি বিভিন্ন উপায়ে ক্লিপ করা আকারের বেশ কয়েকটি সারি এবং দুটি কলাম প্রদর্শন করছেন।

তাদের সবার মধ্যে মিল রয়েছে:

  • একটি বড় আয়তক্ষেত্র (বর্গক্ষেত্র) যা একটি ধারক হিসাবে কাজ করে
  • বড় আয়তক্ষেত্র জুড়ে একটি তির্যক রেখা
  • একটি বৃত্ত
  • পাঠ্যের একটি ছোট স্ট্রিং

এই ধাপে আপনি সংস্থানগুলি থেকে সেই আকারগুলির জন্য মাত্রা সেট আপ করেন, যাতে আপনি পরে সেগুলি ব্যবহার করার সময় আপনাকে শুধুমাত্র একবার মাত্রা পেতে হবে।

  1. ClippedView এ, path নীচে, আকারের পুরো সেটের চারপাশে একটি ক্লিপিং আয়তক্ষেত্রের মাত্রার জন্য ভেরিয়েবল যোগ করুন।
private val clipRectRight = resources.getDimension(R.dimen.clipRectRight)
private val clipRectBottom = resources.getDimension(R.dimen.clipRectBottom)
private val clipRectTop = resources.getDimension(R.dimen.clipRectTop)
private val clipRectLeft = resources.getDimension(R.dimen.clipRectLeft)
  1. একটি আয়তক্ষেত্রের ইনসেট এবং একটি ছোট আয়তক্ষেত্রের অফসেটের জন্য ভেরিয়েবল যোগ করুন।
private val rectInset = resources.getDimension(R.dimen.rectInset)
private val smallRectOffset = resources.getDimension(R.dimen.smallRectOffset)
  1. একটি বৃত্তের ব্যাসার্ধের জন্য একটি চলক যোগ করুন। এটি আয়তক্ষেত্রের ভিতরে আঁকা বৃত্তের ব্যাসার্ধ।
private val circleRadius = resources.getDimension(R.dimen.circleRadius)
  1. আয়তক্ষেত্রের ভিতরে আঁকা পাঠ্যের জন্য একটি অফসেট এবং একটি পাঠ্য আকার যোগ করুন।
private val textOffset = resources.getDimension(R.dimen.textOffset)
private val textSize = resources.getDimension(R.dimen.textSize)

ধাপ 4: সারি এবং কলাম অবস্থান সেট আপ করুন

এই অ্যাপের আকার দুটি কলাম এবং চারটি সারিতে প্রদর্শিত হয়, উপরে সেট করা মাত্রার মান দ্বারা নির্ধারিত হয়। এটির জন্য গণিতটি এই কোডল্যাবের অংশ নয়, তবে আপনি এই ধাপে প্রদত্ত কোডে অনুলিপি করার সময় এটি দেখে নিন।

  1. দুটি কলামের জন্য স্থানাঙ্ক সেট আপ করুন।
private val columnOne = rectInset
private val columnTwo = columnOne + rectInset + clipRectRight
  1. রূপান্তরিত পাঠ্যের চূড়ান্ত সারি সহ প্রতিটি সারির জন্য স্থানাঙ্ক যোগ করুন।
private val rowOne = rectInset
private val rowTwo = rowOne + rectInset + clipRectBottom
private val rowThree = rowTwo + rectInset + clipRectBottom
private val rowFour = rowThree + rectInset + clipRectBottom
private val textRow = rowFour + (1.5f * clipRectBottom)
  1. আপনার অ্যাপ চালান। অ্যাপটির নামের নিচে একটি ফাঁকা সাদা পর্দা দিয়ে অ্যাপটি খুলতে হবে।

onDraw() এ, আপনি নীচের অ্যাপের স্ক্রিনশটে দেখানো সাতটি ভিন্ন ক্লিপ করা আয়তক্ষেত্র আঁকার পদ্ধতিগুলিকে কল করেন। আয়তক্ষেত্রগুলি একইভাবে আঁকা হয়; শুধুমাত্র পার্থক্য হল তাদের সংজ্ঞায়িত ক্লিপিং অঞ্চল এবং স্ক্রিনে অবস্থান।

আয়তক্ষেত্রগুলি আঁকতে ব্যবহৃত অ্যালগরিদম নীচের চিত্র এবং ব্যাখ্যায় দেখানো হিসাবে কাজ করে। সংক্ষেপে, আপনি Canvas উৎপত্তি স্থানান্তর করে আয়তক্ষেত্রের একটি সিরিজ আঁকেন। ধারণাগতভাবে, এটি নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত:

(1) প্রথমে, আপনি যেখানে আয়তক্ষেত্রটি আঁকতে চান সেখানে Canvas অনুবাদ করুন। অর্থাৎ, পরবর্তী আয়তক্ষেত্র এবং অন্যান্য সমস্ত আকারগুলি কোথায় আঁকতে হবে তা গণনা করার পরিবর্তে, আপনি Canvas উত্স, অর্থাৎ এর স্থানাঙ্ক সিস্টেমটি সরান।

(2) তারপর, আপনি ক্যানভাসের নতুন উত্সে আয়তক্ষেত্রটি আঁকবেন। অর্থাৎ, আপনি অনুদিত স্থানাঙ্ক সিস্টেমে একই অবস্থানে আকারগুলি আঁকেন। এটি অনেক সহজ এবং কিছুটা বেশি কার্যকর।

(3) অবশেষে, আপনি Canvas তার আসল Origin ফিরিয়ে আনবেন।

এখানে অ্যালগরিদম হল আপনি এটি বাস্তবায়ন করবেন:

  1. onDraw() -এ ধূসর পটভূমির রঙ দিয়ে Canvas পূরণ করতে একটি ফাংশন কল করুন এবং আসল আকারগুলি আঁকুন।
  2. প্রতিটি ক্লিপ করা আয়তক্ষেত্র এবং আঁকার জন্য পাঠ্যের জন্য একটি ফাংশন কল করুন।

প্রতিটি আয়তক্ষেত্র বা পাঠ্যের জন্য:

  1. Canvas বর্তমান অবস্থা সংরক্ষণ করুন যাতে আপনি সেই প্রাথমিক অবস্থায় পুনরায় সেট করতে পারেন।
  2. আপনি যেখানে আঁকতে চান সেখানে ক্যানভাসের Origin অনুবাদ করুন।
  3. ক্লিপিং আকার এবং পাথ প্রয়োগ করুন.
  4. আয়তক্ষেত্র বা টেক্সট আঁকুন।
  5. Canvas অবস্থা পুনরুদ্ধার করুন।

ধাপ: ওভাররাইড onDraw()

  1. নিচের কোডে দেখানো হিসাবে onDraw() ওভাররাইড করুন। আপনি আঁকা প্রতিটি আকৃতির জন্য একটি ফাংশন কল করুন, যা আপনি পরে বাস্তবায়ন করবেন।
 override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        drawBackAndUnclippedRectangle(canvas)
        drawDifferenceClippingExample(canvas)
        drawCircularClippingExample(canvas)
        drawIntersectionClippingExample(canvas)
        drawCombinedClippingExample(canvas)
        drawRoundedRectangleClippingExample(canvas)
        drawOutsideClippingExample(canvas)
        drawSkewedTextExample(canvas)
        drawTranslatedTextExample(canvas)
        // drawQuickRejectExample(canvas)
    }
  1. প্রতিটি অঙ্কন ফাংশনের জন্য স্টাব তৈরি করুন যাতে কোডটি কম্পাইল করা অব্যাহত থাকে। আপনি নীচের কোড কপি করতে পারেন.
private fun drawBackAndUnclippedRectangle(canvas: Canvas){
}
private fun drawDifferenceClippingExample(canvas: Canvas){
}
private fun drawCircularClippingExample(canvas: Canvas){
}
private fun drawIntersectionClippingExample(canvas: Canvas){
}
private fun drawCombinedClippingExample(canvas: Canvas){
}
private fun drawRoundedRectangleClippingExample(canvas: Canvas){
}
private fun drawOutsideClippingExample(canvas: Canvas){
}
private fun drawTranslatedTextExample(canvas: Canvas){
}
private fun drawSkewedTextExample(canvas: Canvas){
}
private fun drawQuickRejectExample(canvas: Canvas){
}

অ্যাপটি একই আয়তক্ষেত্র আঁকে এবং সাতবার আকার দেয়, প্রথমে কোন ক্লিপিং ছাড়াই, তারপরে বিভিন্ন ক্লিপিং পাথ প্রয়োগ করে ছয়বার। drawClippedRectangle() পদ্ধতিটি একটি আয়তক্ষেত্র আঁকার জন্য কোড বের করে, যেমনটি নীচে দেখানো হয়েছে।

ধাপ 1: drawClippedRectangle() পদ্ধতি তৈরি করুন

  1. একটি drawClippedRectangle() পদ্ধতি তৈরি করুন যা Canvas টাইপের একটি আর্গুমেন্ট canvas নেয়।
private fun drawClippedRectangle(canvas: Canvas) {
}
  1. drawClippedRectangle() পদ্ধতির ভিতরে, পুরো আকৃতির জন্য ক্লিপিং আয়তক্ষেত্রের সীমানা নির্ধারণ করুন। একটি ক্লিপিং আয়তক্ষেত্র প্রয়োগ করুন যা শুধুমাত্র বর্গক্ষেত্র অঙ্কন করতে বাধা দেয়।
canvas.clipRect(
       clipRectLeft,clipRectTop,
       clipRectRight,clipRectBottom
)

Canvas.clipRect(...) পদ্ধতি স্ক্রিনের সেই অঞ্চলকে হ্রাস করে যেখানে ভবিষ্যতের ড্র অপারেশনগুলি লিখতে পারে। এটি ক্লিপিং সীমানাকে বর্তমান ক্লিপিং আয়তক্ষেত্রের স্থানিক ছেদ হিসাবে সেট করে এবং আয়তক্ষেত্রটি clipRect() এ পাস করে। clipRect() পদ্ধতির অনেকগুলি রূপ রয়েছে যা অঞ্চলগুলির জন্য বিভিন্ন ফর্ম গ্রহণ করে এবং ক্লিপিং আয়তক্ষেত্রে বিভিন্ন ক্রিয়াকলাপের অনুমতি দেয়।

  1. সাদা রঙ দিয়ে canvas পূরণ করুন। হ্যাঁ! পুরো ক্যানভাস, কারণ আপনি আয়তক্ষেত্র আঁকছেন না, আপনি ক্লিপ করছেন! ক্লিপিং আয়তক্ষেত্রের কারণে, শুধুমাত্র ক্লিপিং আয়তক্ষেত্র দ্বারা সংজ্ঞায়িত অঞ্চলটি পূর্ণ হয়, একটি সাদা আয়তক্ষেত্র তৈরি করে। পৃষ্ঠের বাকি অংশ ধূসর থাকে।
canvas.drawColor(Color.WHITE)
  1. রঙটি লালে পরিবর্তন করুন এবং ক্লিপিং আয়তক্ষেত্রের ভিতরে একটি তির্যক রেখা আঁকুন।
paint.color = Color.RED
canvas.drawLine(
   clipRectLeft,clipRectTop,
   clipRectRight,clipRectBottom,paint
)
  1. রঙটি সবুজে সেট করুন এবং ক্লিপিং আয়তক্ষেত্রের ভিতরে একটি বৃত্ত আঁকুন।
paint.color = Color.GREEN
canvas.drawCircle(
   circleRadius,clipRectBottom - circleRadius,
   circleRadius,paint
)
  1. রঙটি নীলে সেট করুন এবং ক্লিপিং আয়তক্ষেত্রের ডান প্রান্তের সাথে সারিবদ্ধ পাঠ্য আঁকুন। টেক্সট আঁকতে canvas.drawText() ব্যবহার করুন।
paint.color = Color.BLUE
// Align the RIGHT side of the text with the origin.
paint.textSize = textSize
paint.textAlign = Paint.Align.RIGHT
canvas.drawText(
   context.getString(R.string.clipping),
   clipRectRight,textOffset,paint
)

ধাপ 2: drawBackAndUnclippedRectangle() পদ্ধতি প্রয়োগ করুন

  1. drawClippedRectangle() পদ্ধতিটি কার্যকরভাবে দেখতে, নিচের মত drawBackAndUnclippedRectangle() পদ্ধতিটি প্রয়োগ করে প্রথম আনক্লিপড আয়তক্ষেত্র আঁকুন। canvas সংরক্ষণ করুন, প্রথম সারি এবং কলাম অবস্থানে অনুবাদ করুন, drawClippedRectangle() কল করে আঁকুন, এবং তারপর canvas আগের অবস্থায় ফিরিয়ে আনুন।
private fun drawBackAndUnclippedRectangle(canvas: Canvas){
   canvas.drawColor(Color.GRAY)
   canvas.save()
   canvas.translate(columnOne,rowOne)
   drawClippedRectangle(canvas)
   canvas.restore()
}
  1. আপনার অ্যাপ চালান। আপনি একটি ধূসর পটভূমিতে বৃত্ত, লাল রেখা এবং পাঠ্য সহ প্রথম সাদা আয়তক্ষেত্রটি দেখতে পাবেন।

নিম্নলিখিত ক্লিপিং উদাহরণ পদ্ধতিতে আপনি গ্রাফিকাল প্রভাবগুলি অর্জন করতে ক্লিপিং অঞ্চলগুলির বিভিন্ন সংমিশ্রণ প্রয়োগ করেন এবং আপনার প্রয়োজনীয় যে কোনও আকার তৈরি করতে আপনি কীভাবে ক্লিপিং অঞ্চলগুলিকে একত্রিত করতে পারেন তা শিখুন।

এই পদ্ধতিগুলির প্রতিটি একই প্যাটার্ন অনুসরণ করে।

  1. ক্যানভাসের বর্তমান অবস্থা সংরক্ষণ করুন: canvas. save( )

কার্যকলাপ প্রসঙ্গ অঙ্কন রাজ্যের একটি স্ট্যাক বজায় রাখে. অঙ্কন রাজ্যগুলি বর্তমান রূপান্তর ম্যাট্রিক্স এবং বর্তমান ক্লিপিং অঞ্চল নিয়ে গঠিত। আপনি বর্তমান অবস্থা সংরক্ষণ করতে পারেন, ক্রিয়া সম্পাদন করতে পারেন যা অঙ্কনের অবস্থা পরিবর্তন করে (যেমন ক্যানভাস অনুবাদ করা বা ঘোরানো) এবং তারপরে সংরক্ষিত অঙ্কন অবস্থা পুনরুদ্ধার করতে পারেন। (দ্রষ্টব্য: এটি গিটে "স্ট্যাশ" কমান্ডের মতো!)

যখন আপনার অঙ্কনে রূপান্তর অন্তর্ভুক্ত থাকে, তখন চেইন করা এবং পরিবর্তনগুলিকে বিপরীত করে পূর্বাবস্থায় ফেরানো ত্রুটি-প্রবণ। উদাহরণস্বরূপ, যদি আপনি অনুবাদ করেন, প্রসারিত করেন এবং তারপরে ঘোরান, এটি দ্রুত জটিল হয়ে যায়। পরিবর্তে, ক্যানভাসের অবস্থা সংরক্ষণ করুন, আপনার রূপান্তরগুলি প্রয়োগ করুন, আঁকুন এবং তারপরে পূর্ববর্তী অবস্থা পুনরুদ্ধার করুন।

উদাহরণস্বরূপ, আপনি একটি ক্লিপিং অঞ্চল সংজ্ঞায়িত করতে পারেন এবং সেই রাজ্যটি সংরক্ষণ করতে পারেন। তারপর ক্যানভাস অনুবাদ করুন, একটি ক্লিপিং অঞ্চল যোগ করুন এবং ঘোরান। কিছু অঙ্কন করার পরে, আপনি মূল ক্লিপিং অবস্থা পুনরুদ্ধার করতে পারেন, এবং আপনি একটি ভিন্ন অনুবাদ এবং তির্যক রূপান্তর করতে এগিয়ে যেতে পারেন, যেমন চিত্রে দেখানো হয়েছে।

  1. ক্যানভাসের উৎপত্তি সারি/কলাম স্থানাঙ্কে অনুবাদ করুন: canvas. translate ()

আঁকতে সমস্ত উপাদান সরানোর চেয়ে ক্যানভাসের উত্স সরানো এবং একটি নতুন স্থানাঙ্ক সিস্টেমে একই জিনিস আঁকা অনেক সহজ। (টিপ: আপনি ঘূর্ণায়মান উপাদানগুলির জন্য একই কৌশল ব্যবহার করতে পারেন।)

  1. path রূপান্তর প্রয়োগ করুন, যদি থাকে।
  2. ক্লিপিং প্রয়োগ করুন: canvas.clipPath(path)
  3. আকারগুলি আঁকুন: drawClippedRectangle() or drawText()
  4. আগের ক্যানভাসের অবস্থা পুনরুদ্ধার করুন: canvas.restore()

ধাপ 1: drawDifferenceClippingExample(ক্যানভাস) বাস্তবায়ন করুন

দ্বিতীয় আয়তক্ষেত্র আঁকতে কোড যোগ করুন, যা একটি ছবির ফ্রেম প্রভাব তৈরি করতে দুটি ক্লিপিং আয়তক্ষেত্রের মধ্যে পার্থক্য ব্যবহার করে।

নীচের কোডটি ব্যবহার করুন যা নিম্নলিখিতগুলি করে:

  1. ক্যানভাস সংরক্ষণ করুন।
  2. প্রথম আয়তক্ষেত্রের ডানদিকে প্রথম সারি, দ্বিতীয় কলামে খোলা জায়গায় ক্যানভাসের উৎপত্তি অনুবাদ করুন।
  3. দুটি ক্লিপিং আয়তক্ষেত্র প্রয়োগ করুন। DIFFERENCE অপারেটর প্রথমটি থেকে দ্বিতীয় আয়তক্ষেত্রটি বিয়োগ করে।
  1. পরিবর্তিত ক্যানভাস আঁকতে drawClippedRectangle() পদ্ধতিতে কল করুন।
  2. ক্যানভাসের অবস্থা পুনরুদ্ধার করুন।
private fun drawDifferenceClippingExample(canvas: Canvas) {
   canvas.save()
   // Move the origin to the right for the next rectangle.
   canvas.translate(columnTwo,rowOne)
   // Use the subtraction of two clipping rectangles to create a frame.
   canvas.clipRect(
       2 * rectInset,2 * rectInset,
       clipRectRight - 2 * rectInset,
       clipRectBottom - 2 * rectInset
   )
   // The method clipRect(float, float, float, float, Region.Op
   // .DIFFERENCE) was deprecated in API level 26. The recommended
   // alternative method is clipOutRect(float, float, float, float),
   // which is currently available in API level 26 and higher.
   if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
       canvas.clipRect(
           4 * rectInset,4 * rectInset,
           clipRectRight - 4 * rectInset,
           clipRectBottom - 4 * rectInset,
            Region.Op.DIFFERENCE
       )
   } else {
       canvas.clipOutRect(
           4 * rectInset,4 * rectInset,
           clipRectRight - 4 * rectInset,
           clipRectBottom - 4 * rectInset
       )
   }
   drawClippedRectangle(canvas)
   canvas.restore()
}
  1. আপনার অ্যাপ্লিকেশন চালান এবং এটি এই মত হওয়া উচিত.

ধাপ 2: drawCircularClippingExample(ক্যানভাস) বাস্তবায়ন করুন

এর পরে, একটি আয়তক্ষেত্র আঁকতে কোড যোগ করুন যা একটি বৃত্তাকার পথ থেকে তৈরি একটি বৃত্তাকার ক্লিপিং অঞ্চল ব্যবহার করে, মূলত বৃত্তটি সরিয়ে (আঁকে না) এবং এর পরিবর্তে ধূসর পটভূমি দেখায়।

private fun drawCircularClippingExample(canvas: Canvas) {

   canvas.save()
   canvas.translate(columnOne, rowTwo)
   // Clears any lines and curves from the path but unlike reset(),
   // keeps the internal data structure for faster reuse.
   path.rewind()
   path.addCircle(
       circleRadius,clipRectBottom - circleRadius,
       circleRadius,Path.Direction.CCW
   )
   // The method clipPath(path, Region.Op.DIFFERENCE) was deprecated in
   // API level 26. The recommended alternative method is
   // clipOutPath(Path), which is currently available in
   // API level 26 and higher.
   if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
       canvas.clipPath(path, Region.Op.DIFFERENCE)
   } else {
       canvas.clipOutPath(path)
   }
   drawClippedRectangle(canvas)
   canvas.restore()
}

ধাপ 3: drawIntersectionClipping Example(ক্যানভাস) বাস্তবায়ন করুন

এরপরে, দ্বিতীয় সারি এবং কলামে দুটি ক্লিপিং আয়তক্ষেত্রের ছেদ আঁকতে কোড যোগ করুন।

মনে রাখবেন যে আপনার স্ক্রীন রেজোলিউশনের উপর নির্ভর করে, এই অঞ্চলের চেহারা পরিবর্তিত হবে। দৃশ্যমান অঞ্চলের আকার পরিবর্তন করতে smallRectOffset মাত্রা নিয়ে পরীক্ষা করুন। একটি ছোট smallRectOffset স্ক্রীনে একটি বড় অঞ্চলে পরিণত হয়।

private fun drawIntersectionClippingExample(canvas: Canvas) {
   canvas.save()
   canvas.translate(columnTwo,rowTwo)
   canvas.clipRect(
       clipRectLeft,clipRectTop,
       clipRectRight - smallRectOffset,
       clipRectBottom - smallRectOffset
   )
   // The method clipRect(float, float, float, float, Region.Op
   // .INTERSECT) was deprecated in API level 26. The recommended
   // alternative method is clipRect(float, float, float, float), which
   // is currently available in API level 26 and higher.
   if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
       canvas.clipRect(
           clipRectLeft + smallRectOffset,
           clipRectTop + smallRectOffset,
           clipRectRight,clipRectBottom,
           Region.Op.INTERSECT
       )
   } else {
       canvas.clipRect(
           clipRectLeft + smallRectOffset,
           clipRectTop + smallRectOffset,
           clipRectRight,clipRectBottom
       )
   }
   drawClippedRectangle(canvas)
   canvas.restore()
}

ধাপ 4: drawCombinedClippingExample(ক্যানভাস) বাস্তবায়ন করুন

এরপরে, আকার, একটি বৃত্ত এবং একটি আয়তক্ষেত্রকে একত্রিত করুন এবং একটি ক্লিপিং অঞ্চলকে সংজ্ঞায়িত করার জন্য যেকোনো পথ আঁকুন।

private fun drawCombinedClippingExample(canvas: Canvas) {
   canvas.save()
   canvas.translate(columnOne, rowThree)
   path.rewind()
   path.addCircle(
       clipRectLeft + rectInset + circleRadius,
       clipRectTop + circleRadius + rectInset,
       circleRadius,Path.Direction.CCW
   )
   path.addRect(
       clipRectRight / 2 - circleRadius,
       clipRectTop + circleRadius + rectInset,
       clipRectRight / 2 + circleRadius,
       clipRectBottom - rectInset,Path.Direction.CCW
   )
   canvas.clipPath(path)
   drawClippedRectangle(canvas)
   canvas.restore()
}

ধাপ 5: drawRoundedRectangleClippingExample(ক্যানভাস) বাস্তবায়ন করুন

এর পরে, একটি বৃত্তাকার আয়তক্ষেত্র যোগ করুন যা একটি সাধারণভাবে ব্যবহৃত ক্লিপিং আকৃতি।

  1. শীর্ষ স্তরে, একটি আয়তক্ষেত্র ভেরিয়েবল তৈরি করুন এবং শুরু করুন। RectF হল একটি শ্রেণী যা ফ্লোটিং পয়েন্টে আয়তক্ষেত্রাকার স্থানাঙ্ক ধারণ করে।
private var rectF = RectF(
   rectInset,
   rectInset,
   clipRectRight - rectInset,
   clipRectBottom - rectInset
)
  1. drawRoundedRectangleClippingExample() ফাংশনটি প্রয়োগ করুন। addRoundRect() ফাংশনটি একটি আয়তক্ষেত্র নেয়, কোণার ব্যাসার্ধের x এবং y মানের মান এবং বৃত্তাকার-আয়তক্ষেত্রের কনট্যুরকে বায়ু করার দিকনির্দেশ নেয়। Path.Direction সুনির্দিষ্ট করে কিভাবে বন্ধ আকার (যেমন রেক্ট, ডিম্বাকৃতি) একটি পাথে যোগ করার সময় ভিত্তিক হয়। CCW মানে ঘড়ির কাঁটার বিপরীত দিকে।
private fun drawRoundedRectangleClippingExample(canvas: Canvas) {
   canvas.save()
   canvas.translate(columnTwo,rowThree)
   path.rewind()
   path.addRoundRect(
       rectF,clipRectRight / 4,
       clipRectRight / 4, Path.Direction.CCW
   )
   canvas.clipPath(path)
   drawClippedRectangle(canvas)
   canvas.restore()
}

ধাপ 6: drawOutsideClippingExample(ক্যানভাস) বাস্তবায়ন করুন

ক্লিপিং আয়তক্ষেত্রের ইনসেটগুলিকে দ্বিগুণ করে আয়তক্ষেত্রের চারপাশে বাইরে ক্লিপ করুন।

private fun drawOutsideClippingExample(canvas: Canvas) {
   canvas.save()
   canvas.translate(columnOne,rowFour)
   canvas.clipRect(2 * rectInset,2 * rectInset,
       clipRectRight - 2 * rectInset,
       clipRectBottom - 2 * rectInset)
   drawClippedRectangle(canvas)
   canvas.restore()
}

ধাপ 7: ড্রঅনুবাদিত পাঠ্য উদাহরণ (ক্যানভাস) বাস্তবায়ন করুন

টেক্সট অঙ্কন অন্য কোন আকার থেকে সত্যিই ভিন্ন নয়, এবং আপনি টেক্সট রূপান্তর প্রয়োগ করতে পারেন. উদাহরণস্বরূপ, আপনি ক্যানভাস অনুবাদ করে এবং পাঠ্য অঙ্কন করে পাঠ্য অনুবাদ করতে পারেন।

  1. নিচের ফাংশনটি বাস্তবায়ন করুন।
private fun drawTranslatedTextExample(canvas: Canvas) {
   canvas.save()
   paint.color = Color.GREEN
   // Align the RIGHT side of the text with the origin.
   paint.textAlign = Paint.Align.LEFT
   // Apply transformation to canvas.
   canvas.translate(columnTwo,textRow)
   // Draw text.
   canvas.drawText(context.getString(R.string.translated),
       clipRectLeft,clipRectTop,paint)
   canvas.restore()
}
  1. অনুবাদিত পাঠ্য দেখতে আপনার অ্যাপটি চালান।

ধাপ 8: drawSkewedTextExample(ক্যানভাস) বাস্তবায়ন করুন

আপনি টেক্সট তির্যক করতে পারেন. অর্থাৎ বিভিন্নভাবে বিকৃত করা।

  1. ClippedView এ নিচের ফাংশনটি তৈরি করুন।
private fun drawSkewedTextExample(canvas: Canvas) {
   canvas.save()
   paint.color = Color.YELLOW
   paint.textAlign = Paint.Align.RIGHT
   // Position text.
   canvas.translate(columnTwo, textRow)
   // Apply skew transformation.
   canvas.skew(0.2f, 0.3f)
   canvas.drawText(context.getString(R.string.skewed),
       clipRectLeft, clipRectTop, paint)
   canvas.restore()
}
  1. অনূদিত পাঠ্যের আগে আঁকা তির্যক পাঠ দেখতে আপনার অ্যাপটি চালান।

quickReject() Canvas পদ্ধতি আপনাকে একটি নির্দিষ্ট আয়তক্ষেত্র বা পথটি বর্তমানে দৃশ্যমান অঞ্চলের বাইরে সম্পূর্ণরূপে অবস্থান করবে কিনা তা পরীক্ষা করার অনুমতি দেয়, সমস্ত রূপান্তর প্রয়োগ করার পরে।

quickReject() পদ্ধতিটি অবিশ্বাস্যভাবে কার্যকর যখন আপনি আরও জটিল অঙ্কন তৈরি করছেন এবং যত দ্রুত সম্ভব তা করতে হবে। quickReject() সাহায্যে, আপনি দক্ষতার সাথে সিদ্ধান্ত নিতে পারেন কোন বস্তুগুলি আপনাকে মোটেও আঁকতে হবে না এবং আপনার নিজের ইন্টারসেকশন লজিক লেখার প্রয়োজন নেই।

  • quickReject() পদ্ধতিটি true হয়ে ওঠে যদি আয়তক্ষেত্র বা পথটি স্ক্রিনে দৃশ্যমান না হয়। আংশিক ওভারল্যাপের জন্য, আপনাকে এখনও আপনার নিজের চেক করতে হবে।
  • EdgeType হয় AA ( Antialiased : Treat edges by rounding-out, because they can be antialiased ) অথবা BW (কালো-সাদা: ট্রিট এজগুলিকে শুধুমাত্র নিকটতম পিক্সেলের সীমানায় বৃত্তাকার করে) নিকটতম পিক্সেলের দিকে বৃত্তাকার করার জন্য।

quickReject() এর বেশ কয়েকটি সংস্করণ রয়েছে এবং আপনি সেগুলি ডকুমেন্টেশনেও খুঁজে পেতে পারেন।

boolean

QuickReject (float left, float top, float right, float bottom, Canvas.EdgeType type)

boolean

quickReject ( RectF rect, Canvas.EdgeType type)

boolean

quickReject ( পাথ path, Canvas.EdgeType type)

এই অনুশীলনে, আপনি একটি নতুন সারি আঁকতে যাচ্ছেন, পাঠ্যের নীচে এবং clipRect ভিতরে, আগের মতো।

  • আপনি প্রথমে quickReject() inClipRectangle একটি আয়তক্ষেত্র দিয়ে কল করুন, যা clipRect সাথে ওভারল্যাপ করে। তাই quickReject() মিথ্যা ফেরত দেয়, clipRect BLACK দিয়ে পূর্ণ হয় এবং inClipRectangle আয়তক্ষেত্র আঁকা হয়।

  • তারপর কোড পরিবর্তন করুন এবং notInClipRectangle সহ quickReject() কল করুন। quickReject() এখন সত্য ফেরত দেয়, এবং clipRect WHITE দিয়ে পূর্ণ হয়, এবং notInClipRectangle আঁকা হয় না।

যখন আপনার জটিল অঙ্কন থাকে, তখন এটি আপনাকে দ্রুত বলতে পারে, কোন আকারগুলি সম্পূর্ণরূপে ক্লিপিং অঞ্চলের বাইরে, এবং যার জন্য আপনাকে অতিরিক্ত গণনা এবং অঙ্কন করতে হতে পারে, কারণ সেগুলি আংশিক বা সম্পূর্ণরূপে ক্লিপিং অঞ্চলের ভিতরে রয়েছে৷

ধাপ: quickReject() দিয়ে পরীক্ষা করুন

  1. শীর্ষ-স্তরে, একটি অতিরিক্ত সারির y স্থানাঙ্কের জন্য একটি পরিবর্তনশীল তৈরি করুন।
   private val rejectRow = rowFour + rectInset + 2*clipRectBottom
  1. ClippedView এ নিম্নলিখিত drawQuickRejectExample() ফাংশন যোগ করুন। কোডটি পড়ুন, কারণ এতে quickReject() ব্যবহার করার জন্য আপনার যা জানা দরকার তা রয়েছে।
private fun drawQuickRejectExample(canvas: Canvas) {
   val inClipRectangle = RectF(clipRectRight / 2,
       clipRectBottom / 2,
       clipRectRight * 2,
       clipRectBottom * 2)

   val notInClipRectangle = RectF(RectF(clipRectRight+1,
       clipRectBottom+1,
       clipRectRight * 2,
       clipRectBottom * 2))

   canvas.save()
   canvas.translate(columnOne, rejectRow)
   canvas.clipRect(
       clipRectLeft,clipRectTop,
       clipRectRight,clipRectBottom
   )
   if (canvas.quickReject(
           inClipRectangle, Canvas.EdgeType.AA)) {
       canvas.drawColor(Color.WHITE)
   }
   else {
       canvas.drawColor(Color.BLACK)
       canvas.drawRect(inClipRectangle, paint
       )
   }
       canvas.restore()
}
  1. onDraw() এ, drawQuickRejectExample() এর আহ্বানকে আনকমেন্ট করুন।
  2. আপনার অ্যাপটি চালান, এবং আপনি একটি কালো আয়তক্ষেত্র দেখতে পাবেন, যা পূর্ণ ক্লিপিং অঞ্চল এবং inClipRectangle এর কিছু অংশ, কারণ দুটি আয়তক্ষেত্র ওভারল্যাপ হয়, তাই quickReject() false ফেরত দেয় এবং inClipRectangle আঁকা হয়।

  1. drawQuickRejectExample() এ, notInClipRectangle. বিরুদ্ধে quickReject() চালানোর জন্য কোড পরিবর্তন করুন। এখন quickReject() true ফেরত দেয় এবং ক্লিপিং অঞ্চলটি সাদা দিয়ে পূর্ণ হয়।

সমাপ্ত কোডল্যাবের জন্য কোডটি ডাউনলোড করুন..

$  git clone https://github.com/googlecodelabs/android-kotlin-drawing-clipping


বিকল্পভাবে আপনি একটি জিপ ফাইল হিসাবে সংগ্রহস্থলটি ডাউনলোড করতে পারেন, এটি আনজিপ করতে পারেন এবং এটি অ্যান্ড্রয়েড স্টুডিওতে খুলতে পারেন।

জিপ ডাউনলোড করুন

  • একটি কার্যকলাপের Context একটি অবস্থা বজায় রাখে যা Canvas জন্য রূপান্তর এবং ক্লিপিং অঞ্চল সংরক্ষণ করে।
  • আঁকতে এবং আপনার ক্যানভাসের আসল অবস্থায় ফিরে যেতে canvas.save() এবং canvas.restore() ব্যবহার করুন।
  • একটি ক্যানভাসে একাধিক আকার আঁকতে, আপনি হয় তাদের অবস্থান গণনা করতে পারেন, অথবা আপনি আপনার অঙ্কন পৃষ্ঠের উৎপত্তি স্থানান্তর (অনুবাদ) করতে পারেন। পরেরটি বারবার ড্র সিকোয়েন্সের জন্য ইউটিলিটি পদ্ধতি তৈরি করা সহজ করে তুলতে পারে।
  • ক্লিপিং অঞ্চলগুলি যে কোনও আকার, আকার বা পথের সংমিশ্রণ হতে পারে।
  • আপনার প্রয়োজনীয় অঞ্চল পেতে আপনি ক্লিপিং অঞ্চলগুলি যোগ, বিয়োগ এবং ছেদ করতে পারেন।
  • আপনি ক্যানভাস রূপান্তর করে টেক্সট রূপান্তর প্রয়োগ করতে পারেন.
  • quickReject() Canvas পদ্ধতি আপনাকে একটি নির্দিষ্ট আয়তক্ষেত্র বা পথটি বর্তমানে দৃশ্যমান অঞ্চলের বাইরে সম্পূর্ণরূপে অবস্থান করবে কিনা তা পরীক্ষা করতে দেয়।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক কীভাবে স্ক্রিনে আঁকে তার গভীর ব্যাখ্যার জন্য নিবন্ধগুলির গ্রাফিক্স আর্কিটেকচার সিরিজটিও দেখুন।

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

আপনি আকৃতি থেকে দক্ষতার সাথে বাদ দেওয়ার জন্য কোন পদ্ধতিকে কল করেন?

excludeFromDrawing()

quickReject()

onDraw()

clipRect()

প্রশ্ন 2

Canvas.save() এবং Canvas.restore() কোন তথ্য সংরক্ষণ এবং পুনরুদ্ধার?

▢ রঙ, লাইন প্রস্থ, ইত্যাদি

▢ শুধুমাত্র বর্তমান রূপান্তর

▢ বর্তমান রূপান্তর এবং ক্লিপিং অঞ্চল

▢ শুধুমাত্র বর্তমান ক্লিপিং অঞ্চল

প্রশ্ন 3

Paint.Align নির্দিষ্ট করে:

▢ কিভাবে নিচের অঙ্কন আকারগুলি সারিবদ্ধ করবেন

▢ পাঠ্যটি উৎপত্তির কোন দিক থেকে আঁকা হয়েছে

▢ যেখানে ক্লিপিং অঞ্চলে এটি সারিবদ্ধ

▢ টেক্সটের কোন দিকে মূলের সাথে সারিবদ্ধ করতে হবে

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, কোটলিন কোডল্যাবগুলির ল্যান্ডিং পৃষ্ঠাতে উন্নত Android দেখুন৷