SpannableString হল Android SDK-এর একটি ক্লাস যা android.text প্যাকেজ থেকে আসে এবং আপনাকে TextView-এ একটি টেক্সট স্ট্রিংয়ের বিভিন্ন অংশে একাধিক স্টাইল প্রয়োগ করতে দেয়। HTML মার্কআপের বিপরীতে, SpannableString Span অবজেক্টের স্তরে কাজ করে, টেক্সটের ভিজ্যুয়াল প্রদর্শন নিয়ন্ত্রণ করে: রং, আকার, ফন্ট, আন্ডারলাইন এবং ইন্টারেক্টিভ উপাদান। Google Developers-এর মতে, Android সিস্টেম কম্পোনেন্টে লিংক ফরম্যাটিংয়ের জন্য SpannableString ব্যবহৃত হয়। এটি তৃতীয় পক্ষের লাইব্রেরি ছাড়াই টেক্সট স্টাইল করার প্রাথমিক উপায়।
মূল বিষয়
SpannableString একটি Android ক্লাস যা Spannable ইন্টারফেস বাস্তবায়ন করে, ভিজ্যুয়াল প্রদর্শন নিয়ন্ত্রণকারী Span অবজেক্টের সেট সহ টেক্সট সংরক্ষণ করে। সাধারণ String-এর বিপরীতে, SpannableString নির্দিষ্ট অক্ষর রেঞ্জে স্টাইল অ্যাট্রিবিউট সংযুক্ত করার অনুমতি দেয়: টেক্সটের অংশ লাল করা, হেডিংয়ে ফন্টের আকার বাড়ানো বা প্যারাগ্রাফের ভিতরে ক্লিকযোগ্য লিংক যোগ করা।
ক্লাসটি android.text প্যাকেজে রয়েছে এবং API Level 1 থেকে উপলব্ধ। SpannableString অপরিবর্তনীয় — একবার তৈরি হলে এর গঠন স্থির হয়ে যায় এবং টেক্সট প্রতিস্থাপনের জন্য একটি নতুন অবজেক্ট তৈরি করতে হয়। ডায়নামিক এডিটিংয়ের জন্য SpannableStringBuilder ব্যবহৃত হয়, যা স্টাইল না হারিয়ে অক্ষর সন্নিবেশ এবং মুছে ফেলা সমর্থন করে।
CharSequence হল টেক্সট ডেটার জন্য বেস ইন্টারফেস, যা String, StringBuilder এবং SpannableString বাস্তবায়ন করে। SpannableString এবং String-এর মধ্যে প্রধান পার্থক্য হল সাবস্ট্রিংয়ে ইচ্ছামতো অবজেক্ট সংযুক্ত করার সমর্থন। TextView Spannable ইন্টারফেস চিনতে পারে এবং রেন্ডারিংয়ের সময় সম্পর্কিত টেক্সট সেগমেন্টে স্প্যান অবজেক্ট প্রয়োগ করে। আপনি যদি TextView-তে একটি সাধারণ String পাস করেন, তাহলে কোনো স্টাইল প্রয়োগ হবে না।
SpannableString টেক্সটকে char[] অ্যারে এবং শুরু ও শেষ অবস্থানের মেটাডেটা সহ স্প্যান অবজেক্টের একটি পৃথক অ্যারেতে সংরক্ষণ করে। যখন setSpan(what, start, end, flags) কল করা হয়, তখন what অবজেক্টটি রেঞ্জ তথ্য সহ তালিকায় সংরক্ষিত হয়। রেন্ডারিংয়ের সময়, TextView প্রদর্শিত রেঞ্জের মধ্যে পড়া সমস্ত স্প্যান ক্রমিকভাবে প্রয়োগ করে, updateDrawState এবং updateMeasureState মেথড কল করে।
CharacterStyle হল স্প্যানের জন্য বেস ক্লাস যা লাইনে অবস্থান নির্বিশেষে পৃথক অক্ষরকে প্রভাবিত করে। এর মধ্যে রয়েছে ForegroundColorSpan (টেক্সট রং), RelativeSizeSpan (আপেক্ষিক আকার), StyleSpan (বোল্ড এবং ইটালিক), UnderlineSpan (আন্ডারলাইন) এবং অন্যান্য। ক্যারেক্টার স্প্যান নির্দিষ্ট রেঞ্জের প্রতিটি অক্ষরে পৃথকভাবে প্রয়োগ হয়।
ParagraphStyle হল স্প্যানের জন্য একটি ইন্টারফেস যা পুরো প্যারাগ্রাফকে প্রভাবিত করে। সবচেয়ে পরিচিত প্রতিনিধি হল AlignmentSpan, যা পুরো প্যারাগ্রাফকে বামে, মাঝে বা ডানে সারিবদ্ধ করে। প্যারাগ্রাফ স্প্যানকে পুরো প্যারাগ্রাফ কভার করতে হবে; অন্যথায়, Android তাদের প্রয়োগ উপেক্ষা করে। এই সীমাবদ্ধতা কারণ সারিবদ্ধকরণ বা ইন্ডেন্টেশন শুধুমাত্র একটি সম্পূর্ণ টেক্সট ব্লকের জন্য অর্থপূর্ণ।
Span ফ্ল্যাগ হল চারটি ধ্রুবক যা স্প্যানের আচরণ সংজ্ঞায়িত করে যখন তার রেঞ্জের সীমানায় টেক্সট ঢোকানো বা মুছে ফেলা হয়। SPAN_EXCLUSIVE_EXCLUSIVE স্প্যানকে শুধুমাত্র মূল সীমানার মধ্যে সক্রিয় রাখে, SPAN_INCLUSIVE_INCLUSIVE সীমানায় টেক্সট যোগ করলে এটি প্রসারিত করে। SPAN_EXCLUSIVE_INCLUSIVE এবং SPAN_INCLUSIVE_EXCLUSIVE রেঞ্জের শুরু এবং শেষের জন্য মিশ্র আচরণ প্রদান করে।
| ফ্ল্যাগ | বামে সন্নিবেশ | ডানে সন্নিবেশ |
|---|---|---|
| SPAN_EXCLUSIVE_EXCLUSIVE | অন্তর্ভুক্ত করে না | অন্তর্ভুক্ত করে না |
| SPAN_INCLUSIVE_INCLUSIVE | অন্তর্ভুক্ত করে | অন্তর্ভুক্ত করে |
| SPAN_EXCLUSIVE_INCLUSIVE | অন্তর্ভুক্ত করে না | অন্তর্ভুক্ত করে |
| SPAN_INCLUSIVE_EXCLUSIVE | অন্তর্ভুক্ত করে | অন্তর্ভুক্ত করে না |
EditText-এ Editable টেক্সটের জন্য সঠিক ফ্ল্যাগ নির্বাচন করা গুরুত্বপূর্ণ, যেখানে ব্যবহারকারী অক্ষর সন্নিবেশ এবং মুছে ফেলতে পারেন। শুধু-পঠনযোগ্য TextView-এর জন্য, সাধারণত SPAN_EXCLUSIVE_EXCLUSIVE ব্যবহৃত হয় — স্টাইল শুধুমাত্র মূল রেঞ্জে প্রয়োগ হয় এবং প্রোগ্রাম্যাটিক পরিবর্তনের সাথে প্রসারিত হয় না।
Android SDK 25টিরও বেশি বিল্ট-ইন স্প্যান ক্লাস প্রদান করে যা বেশিরভাগ টেক্সট স্টাইলিং কাজ কভার করে। প্রতিটি ক্লাস CharacterStyle বা ParagraphStyle ইন্টারফেস বাস্তবায়ন করে এবং তার কন্সট্রাক্টরের মাধ্যমে প্যারামিটার গ্রহণ করে। সমস্ত ক্লাস android.text.style প্যাকেজে রয়েছে এবং অতিরিক্ত নির্ভরতা ছাড়াই উপলব্ধ।
ForegroundColorSpan নির্দিষ্ট রেঞ্জের জন্য টেক্সটের রং সেট করে, int ফরম্যাটে রং গ্রহণ করে। BackgroundColorSpan টেক্সটের পিছনের পটভূমি রঙ করে, যা অনুসন্ধান ফলাফল হাইলাইট করার জন্য দরকারী। AbsoluteSizeSpan পিক্সেলে সঠিক ফন্টের আকার সেট করে, RelativeSizeSpan TextView-তে বেস টেক্সট আকারের সাপেক্ষে গুণক প্রয়োগ করে।
StyleSpan Typeface.NORMAL, Typeface.BOLD, Typeface.ITALIC বা BOLD_ITALIC ধ্রুবক গ্রহণ করে এবং অক্ষরের টাইপফেস পরিবর্তন করে। UnderlineSpan আন্ডারলাইন যোগ করে, StrikethroughSpan স্ট্রাইকথ্রু যোগ করে। SuperscriptSpan এবং SubscriptSpan সুপারস্ক্রিপ্ট এবং সাবস্ক্রিপ্ট তৈরি করে। TypefaceSpan টেক্সট রেঞ্জের জন্য Typeface অবজেক্টের মাধ্যমে কাস্টম ফন্ট সেট করার অনুমতি দেয়।
ClickableSpan ক্লিকযোগ্য টেক্সট সেগমেন্ট তৈরির জন্য একটি অ্যাবস্ট্রাক্ট ক্লাস। ট্যাপ করলে, onClick() মেথড কল হয়। ক্লিক কাজ করার জন্য, TextView-তে setMovementMethod(LinkMovementMethod.getInstance()) থাকতে হবে। URLSpan হাইপারলিংকের জন্য ClickableSpan-এর একটি উপশ্রেণী যা স্বয়ংক্রিয়ভাবে ব্রাউজার খোলে। ClickableSpan প্রায়শই ForegroundColorSpan-এর সাথে যুক্ত করা হয় লিংকটিকে নীল রঙে দৃশ্যমানভাবে হাইলাইট করতে।
val spannable = SpannableString("Open developer.android.com")
spannable.setSpan(
URLSpan("https://developer.android.com"),
9, 31, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
ForegroundColorSpan(Color.BLUE),
9, 31, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()
LinkMovementMethod ছাড়া, URLSpan-এ ক্লিক প্রক্রিয়া করা হবে না। MovementMethod স্পর্শ ইভেন্ট আটকানো এবং স্পর্শ অবস্থানে ClickableSpan খুঁজে বের করার জন্য দায়ী। রং স্প্যান লিংকটিকে ব্যবহারকারীর কাছে দৃশ্যমান করে।
SpannableString-এর সাথে কাজ শুরু হয় একটি টেক্সট স্ট্রিং থেকে ইনস্ট্যান্স তৈরি করে এবং setSpan() মেথডের মাধ্যমে ক্রমিকভাবে স্প্যান প্রয়োগ করে। মেথডটি চারটি প্যারামিটার নেয়: স্প্যান অবজেক্ট, শুরু অবস্থান, শেষ অবস্থান এবং ফ্ল্যাগ। সমস্ত স্প্যান সেট করার পর, অবজেক্টটি setText()-এর মাধ্যমে TextView-তে পাস করা হয়।
আসুন একটি স্ট্রিং তৈরি করি যেখানে প্রথম শব্দটি লাল এবং বড় হবে। এর জন্য, আমরা রঙের জন্য ForegroundColorSpan এবং স্কেলের জন্য RelativeSizeSpan ব্যবহার করি। উভয় স্প্যান স্বাধীনভাবে একই রেঞ্জে প্রয়োগ হয় — setSpan কলের ক্রম গুরুত্বপূর্ণ নয়।
val text = "Header: remaining text"
val spannable = SpannableString(text)
val colorSpan = ForegroundColorSpan(Color.RED)
val sizeSpan = RelativeSizeSpan(1.5f)
spannable.setSpan(colorSpan, 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
spannable.setSpan(sizeSpan, 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.text = spannable
অবস্থান 0 থেকে 9 পর্যন্ত অক্ষরগুলি একসাথে উভয় স্টাইল পায়। TextView রেন্ডারিংয়ের সময় স্বয়ংক্রিয়ভাবে সমস্ত স্প্যান প্রয়োগ করে — কোনো অতিরিক্ত কলের প্রয়োজন নেই। 1.5f গুণক সহ RelativeSizeSpan বেসের সাপেক্ষে ফন্টের আকার 50% বাড়ায়।
Html.fromHtml() HTML স্ট্রিং থেকে Spanned অবজেক্ট তৈরি করে, কিন্তু সমর্থিত ট্যাগের সেট সীমিত। SpannableString HTML সীমাবদ্ধতা ছাড়াই প্রতিটি অ্যাট্রিবিউটের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। যদি আপনার HTML-কে স্প্যানে রূপান্তর করে তারপর কাস্টম স্টাইল যোগ করার প্রয়োজন হয়, তাহলে আপনি Html.fromHtml() কে ভিত্তি হিসাবে ব্যবহার করতে পারেন এবং তারপর setSpan()-এর মাধ্যমে স্প্যান দিয়ে পরিপূরক করতে পারেন।
val htmlText = Html.fromHtml(
"<b>Important:</b> check the data",
Html.FROM_HTML_MODE_LEGACY
)
val spannable = SpannableString(htmlText)
spannable.setSpan(
ForegroundColorSpan(Color.RED),
0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
ফলাফল — টেক্সট “গুরুত্বপূর্ণ:” বোল্ড (HTML থেকে) এবং লাল (স্প্যান থেকে) হবে। এই পদ্ধতি সার্ভার কন্টেন্টের সাথে কাজ করার সময় সুবিধাজনক যেখানে ফরম্যাটিংয়ের কিছু অংশ HTML-এ নির্দিষ্ট করা হয় এবং কিছু অংশ ক্লায়েন্ট পাশে প্রোগ্রাম্যাটিকভাবে যোগ করা হয়।
SpannableString একই বা ওভারল্যাপিং রেঞ্জে সীমাহীন সংখ্যক স্প্যান প্রয়োগ করার অনুমতি দেয়। স্প্যান একত্রিত করা HTML মার্কআপের তুলনায় একটি মূল সুবিধা, যেখানে নেস্টেড ট্যাগ সংঘর্ষ করতে পারে। স্প্যানগুলি স্বাধীন এবং রেন্ডারিংয়ের সময় ক্রমিকভাবে প্রয়োগ হয়।
উদাহরণস্বরূপ, আপনি একটি টেক্সট সেগমেন্টকে একসাথে বোল্ড, লাল এবং ক্লিকযোগ্য করতে পারেন। এটি করতে, তিনটি স্প্যান তৈরি করুন — StyleSpan, ForegroundColorSpan এবং ClickableSpan — এবং প্রতিটি একই রেঞ্জে প্রয়োগ করুন। প্রয়োগের ক্রম ফলাফলকে প্রভাবিত করে না, কারণ প্রতিটি স্প্যান তার নিজস্ব টেক্সট অ্যাট্রিবিউটের জন্য দায়ী।
যদি বিভিন্ন প্রকারের স্প্যান আংশিকভাবে ওভারল্যাপ করে, প্রতিটি তার নিজস্ব সীমানার মধ্যে স্বাধীনভাবে কাজ করে। রেঞ্জ 0–10-এ ForegroundColorSpan এবং রেঞ্জ 5–15-এ StyleSpan(BOLD) সেগমেন্ট 5–10-এ বোল্ড লাল টেক্সট এবং 10–15-এ শুধুমাত্র বোল্ড দেবে। কোনো সংঘর্ষ হয় না কারণ প্রতিটি স্প্যান রেন্ডারিংয়ের সময় তার নিজস্ব অ্যাট্রিবিউট পরিবর্তন করে।
getSpans(int start, int end, Class type) মেথড নির্দিষ্ট রেঞ্জের মধ্যে স্প্যানের একটি অ্যারে ফেরত দেয়। এটি পরীক্ষা করার জন্য দরকারী যে কোন স্টাইল ইতিমধ্যে প্রয়োগ করা হয়েছে, বা নির্দিষ্ট স্প্যান সরানোর জন্য। nextSpanTransition() দিয়ে, আপনি স্প্যান পরিবর্তন সীমানায় পুনরাবৃত্তি করতে পারেন — এটি কাস্টম TextView বাস্তবায়নের ভিত্তি যা জানতে হবে কোথায় স্টাইল পরিবর্তন হয়।
SpannableStringBuilder হল খণ্ড সন্নিবেশ, প্রতিস্থাপন এবং মুছে ফেলার ক্ষমতা সহ স্টাইলযুক্ত টেক্সটের ধাপে ধাপে নির্মাণের জন্য একটি ক্লাস। SpannableString-এর বিপরীতে, যা একটি তৈরি স্ট্রিং থেকে তৈরি হয় এবং অপরিবর্তনীয়, Builder টেক্সট অংশগুলি ক্রমিকভাবে যোগ করার এবং চলার পথে স্টাইল নির্ধারণ করার অনুমতি দেয়। এটি যৌগিক বার্তাগুলির জন্য আদর্শ: লগ, চ্যাট, ডায়নামিক লেবেল সহ সংবাদ শিরোনাম।
Builder Spannable এবং Editable ইন্টারফেস বাস্তবায়ন করে, যা এটিকে EditText-এর সাথে সামঞ্জস্যপূর্ণ করে। ব্যবহারকারী টেক্সট সম্পাদনা করতে পারে, এবং স্টাইল সংরক্ষিত থাকে এবং নতুন অক্ষর সন্নিবেশ করালে সঠিকভাবে স্থানান্তরিত হয়। SpannableString, অপরিবর্তনীয় হওয়ায়, সম্পাদনাযোগ্য ফিল্ডের জন্য উপযুক্ত নয়।
append() মেথড builder-কেই ফেরত দেয়, যা মেথড চেইনিং সক্ষম করে। টেক্সট যোগ করার পর, setSpan()-এর মাধ্যমে স্প্যান প্রয়োগ করা হয়। অবস্থানগুলি বর্তমান builder দৈর্ঘ্যের সাপেক্ষে নির্দিষ্ট করা হয়। আরও সুনির্দিষ্ট কন্টেন্ট নিয়ন্ত্রণের জন্য Insert() এবং replace()-ও উপলব্ধ।
val builder = SpannableStringBuilder()
.append("New ")
.append("comment")
val blue = ForegroundColorSpan(Color.BLUE)
val gray = ForegroundColorSpan(Color.GRAY)
builder.setSpan(blue, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
builder.setSpan(gray, 6, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.text = builder
টেক্সট “নতুন ” নীল রঙে এবং “মন্তব্য” ধূসর রঙে রঙিন। তাদের মধ্যে অতিরিক্ত অক্ষর সন্নিবেশ করালে, EXCLUSIVE ফ্ল্যাগের কারণে স্প্যান নতুন টেক্সটকে প্রভাবিত করবে না। Builder পরিবর্তনের সময় স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ সূচকগুলি সামঞ্জস্য করে।
বিপুল সংখ্যক স্প্যান ব্যবহার TextView-এর রেন্ডারিং পারফরম্যান্সকে প্রভাবিত করে। প্রতিটি স্প্যান প্রতিটি পুনরায় ড্রাতে updateDrawState() বা updateMeasureState() মেথড কল করে। মিড-রেঞ্জ ডিভাইসে আরামদায়ক পারফরম্যান্সের জন্য প্রতি TextView-তে 50–100 স্প্যান সীমিত রাখার পরামর্শ দেওয়া হয়। টেক্সট আকার পরিবর্তনকারী স্প্যানগুলি (RelativeSizeSpan, AbsoluteSizeSpan) প্রতিটি পরিবর্তনে লেআউট পুনঃগণনা প্রয়োজন, যা শুধুমাত্র রং বা আন্ডারলাইন স্প্যানের তুলনায় উল্লেখযোগ্যভাবে বেশি ব্যয়বহুল।
TextAppearanceSpan একটি একক setSpan() কলের সাথে android:textAppearance XML রিসোর্স থেকে স্টাইলের একটি সম্পূর্ণ সেট প্রয়োগ করার অনুমতি দেয়। তিনটি পৃথক স্প্যান (রং, আকার, ফন্ট) এর পরিবর্তে, একটি স্টাইল রেফারেন্স সহ একটি একক TextAppearanceSpan ব্যবহৃত হয়। এটি অবজেক্টের সংখ্যা হ্রাস করে এবং রক্ষণাবেক্ষণ সহজ করে — রিসোর্সে স্টাইল পরিবর্তন স্বয়ংক্রিয়ভাবে এই স্প্যান ব্যবহার করে এমন সমস্ত টেক্সটে প্রয়োগ হয়।
প্রতিটি setSpan()-এর জন্য একটি নতুন স্প্যান ইনস্ট্যান্স তৈরি করা গার্বেজ কালেক্টরের উপর অতিরিক্ত চাপ ফেলে। যদি এগুলি বারবার ব্যবহার করা হয় তবে স্থির স্প্যান অবজেক্ট তৈরি করা সর্বোত্তম। উদাহরণস্বরূপ, ForegroundColorSpan(Color.RED) একটি companion অবজেক্টে সংরক্ষণ এবং পুনঃব্যবহার করা যেতে পারে। তবে, অবস্থা সহ স্প্যানগুলি (বিভিন্ন হ্যান্ডলার সহ ClickableSpan) প্রতিটি ক্ষেত্রে পৃথকভাবে তৈরি করা উচিত।
স্প্যান পারফরম্যান্স সমস্যা নির্ণয়ের জন্য, Android Studio-তে Layout Inspector এবং GPU প্রোফাইলার ব্যবহার করুন। যদি অনেক স্প্যান সহ একটি TextView স্ক্রোল করার সময় লক্ষণীয়ভাবে ধীর হয়ে যায়, তাহলে TextAppearanceSpan-এর মাধ্যমে কিছু স্প্যানকে স্ট্যাটিক স্টাইলে প্রতিস্থাপন বা কাস্টম UpdateAppearance বাস্তবায়নে অ্যাট্রিবিউট একত্রিত করে স্প্যানের সংখ্যা কমানোর কথা বিবেচনা করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
String স্টাইল সমর্থন ছাড়াই অক্ষরের একটি অপরিবর্তনীয় ক্রম। SpannableString একই অক্ষর সংরক্ষণ করে তবে অতিরিক্তভাবে ফরম্যাটিং তথ্য সহ Span অবজেক্টের একটি অ্যারে ধারণ করে। TextView পাস করা CharSequence-এর প্রকার নির্ধারণ করে এবং রেন্ডারিংয়ের সময় সংশ্লিষ্ট রেঞ্জে স্প্যান প্রয়োগ করে। String কোনো স্টাইল অ্যাট্রিবিউট উপেক্ষা করে এবং প্লেইন টেক্সট হিসেবে প্রদর্শিত হয়।
removeSpan(Object span) মেথড একটি নির্দিষ্ট স্প্যান সরিয়ে দেয়। সম্পূর্ণ পরিষ্কারের জন্য, getSpans(0, length, Object::class.java) কল করুন, যা সমস্ত স্প্যানের একটি অ্যারে ফেরত দেয়, তারপর প্রতিটি removeSpan-এর মাধ্যমে সরিয়ে ফেলুন। বিকল্পভাবে, স্প্যান ছাড়া একটি নতুন SpannableString(text.toString()) তৈরি করুন। SpannableStringBuilder-এ clear() মেথড রয়েছে যা টেক্সট এবং স্প্যান উভয়ই সরিয়ে দেয়।
SpannableString EditText-এ কাজ করে, কিন্তু সম্পাদনাযোগ্য টেক্সটের জন্য SpannableStringBuilder পছন্দনীয় যা Editable বাস্তবায়ন করে। EditText-এর পরিবর্তন ট্র্যাক করতে Editable ইন্টারফেস প্রয়োজন। আপনি যদি EditText-এ SpannableString পাস করেন, টেক্সট স্টাইল সহ প্রদর্শিত হবে, কিন্তু সম্পাদনার সময় Android এটিকে Editable-এ রূপান্তর করবে, যা কিছু স্প্যান রিসেট করতে পারে।
Jetpack Compose-এ, Android SDK স্প্যান সরাসরি ব্যবহার করা হয় না। পরিবর্তে, Compose AnnotatedString প্রদান করে, যা অনুরূপ ক্ষমতা সহ SpannableString-এর নিজস্ব সমতুল্য: পৃথক অক্ষর স্টাইলের জন্য SpanStyle এবং প্যারাগ্রাফের জন্য ParagraphStyle। SpannableString-কে AnnotatedString-এ রূপান্তর স্প্যানের উপর পুনরাবৃত্তি সহ buildAnnotatedString-এর মাধ্যমে সম্ভব।
একটি ক্লাস তৈরি করুন যা CharacterStyle প্রসারিত করে এবং updateDrawState(TextPaint tp) মেথড ওভাররাইড করে। মেথডের ভিতরে, TextPaint বৈশিষ্ট্যগুলি পরিবর্তন করুন: রং, স্ট্রোক প্রস্থ, ইফেক্ট। মেট্রিক পরিবর্তনের জন্য, UpdateLayout বা MetricAffectingSpan ব্যবহার করুন। কাস্টম স্প্যান বিল্ট-ইন স্প্যানের মতোই setSpan()-এর মাধ্যমে প্রয়োগ করা হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন