একটি ভাল-ডিজাইন করা কাস্টম ভিউ অন্য যেকোনও ভাল-ডিজাইন করা ক্লাসের মতোই। এটি একটি সহজ ইন্টারফেসের মাধ্যমে নির্দিষ্ট সেট অফ ফাংশনালিটি এনক্যাপসুলেট করে, সিপিইউ ও মেমরি দক্ষতার সাথে ব্যবহার করে এবং আরও অনেক কিছু। একটি ভাল-ডিজাইন করা ক্লাস হওয়ার পাশাপাশি, একটি কাস্টম ভিউকে অবশ্যই নিম্নলিখিতগুলি করতে হবে:
- Android স্ট্যান্ডার্ড মেনে চলে।
- কাস্টম স্টাইল করা যায় এমন অ্যাট্রিবিউট প্রদান করুন যা Android XML লেআউটের সাথে কাজ করে।
- অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান।
- একাধিক Android প্ল্যাটফর্মের সাথে মানানসই হতে হবে।
Android ফ্রেমওয়ার্ক আপনাকে এমন একটি ভিউ তৈরি করতে সাহায্য করার জন্য মূল ক্লাস এবং XML ট্যাগের একটি সেট প্রদান করে যা এইসব প্রয়োজনীয়তা পূরণ করে। এই পাঠে আলোচনা করা হয়েছে যে কীভাবে Android ফ্রেমওয়ার্ক ব্যবহার করে ভিউ ক্লাসের মূল কার্যকারিতা তৈরি করা যায়।
আপনি কাস্টম ভিউ কম্পোনেন্ট থেকে অতিরিক্ত তথ্য পাবেন।
ভিউ সাবক্লাস করা
Android ফ্রেমওয়ার্কে সংজ্ঞায়িত সব ভিউ ক্লাস
View-কে এক্সটেন্ড করে। আপনার
কাস্টম ভিউ সরাসরি View-কে
এক্সটেন্ড করতে পারে অথবা আপনি
আগে থেকে থাকা ভিউ
সাবক্লাসের মধ্যে কোনও একটিকে এক্সটেন্ড করে সময় বাঁচাতে পারেন,
যেমন Button।
Android Studio-কে আপনার ভিউয়ের সাথে ইন্টার্যাক্ট করার অনুমতি দিতে, আপনাকে অন্তত একটি কনস্ট্রাক্টর প্রদান করতে হবে যা প্যারামিটার হিসেবে একটি
Context এবং একটি AttributeSet অবজেক্ট নেয়।
এই কনস্ট্রাক্টর লেআউট এডিটরকে আপনার ভিউয়ের ইনস্ট্যান্স তৈরি ও এডিট করার অনুমতি দেয়।
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
জাভা
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
কাস্টম অ্যাট্রিবিউট নির্ধারণ করুন
আপনার ইউজার ইন্টারফেসে বিল্ট-ইন View যোগ করতে, এটি XML এলিমেন্টে উল্লেখ করুন এবং
এলিমেন্ট অ্যাট্রিবিউটের মাধ্যমে এর
উপস্থিতি ও আচরণ নিয়ন্ত্রণ করুন। এছাড়াও, আপনি XML ব্যবহার করে কাস্টম ভিউ
যোগ ও স্টাইল করতে পারবেন। আপনার কাস্টম ভিউতে এই আচরণ চালু করতে, নিম্নলিখিতগুলি করুন:
<declare-styleable>রিসোর্স এলিমেন্টে আপনার ভিউয়ের জন্য কাস্টম অ্যাট্রিবিউট সংজ্ঞায়িত করুন।- আপনার XML লেআউটে অ্যাট্রিবিউটের জন্য মান উল্লেখ করুন।
- রানটাইমে অ্যাট্রিবিউট ভ্যালু রিট্রিভ করুন।
- আপনার ভিউতে অ্যাট্রিবিউটের পাওয়া ভ্যালু প্রয়োগ করুন।
এই বিভাগে কাস্টম অ্যাট্রিবিউট কীভাবে সংজ্ঞায়িত করতে হয় এবং সেগুলির ভ্যালু কীভাবে নির্দিষ্ট করতে হয় তা আলোচনা করা হয়েছে। পরবর্তী বিভাগে রানটাইমে ভ্যালু উদ্ধার ও প্রয়োগ করার বিষয়ে আলোচনা করা হয়েছে।
কাস্টম অ্যাট্রিবিউট নির্ধারণ করতে, আপনার প্রোজেক্টে <declare-styleable>
রিসোর্স যোগ করুন। এইসব রিসোর্স res/values/attrs.xml ফাইলে
রাখাটা প্রথাগত। এখানে
attrs.xml ফাইলের একটি উদাহরণ দেওয়া হল:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
এই কোড দুটি কাস্টম অ্যাট্রিবিউট ঘোষণা করে, showText এবং labelPosition,
যা PieChart নামের স্টাইল করা যায় এমন
এন্টিটির অন্তর্গত। স্টাইল করা যায় এমন এন্টিটির নাম, কনভেনশন অনুযায়ী, কাস্টম ভিউ সংজ্ঞায়িত করে এমন
ক্লাসের নামের
মতোই একই
নাম হয়। যদিও এই কনভেনশন অনুসরণ করা বাধ্যতামূলক নয়,
অনেক জনপ্রিয় কোড
এডিটর স্টেটমেন্ট সম্পূর্ণ করার জন্য এই নামকরণ কনভেনশনের উপর নির্ভর করে।
কাস্টম অ্যাট্রিবিউট সংজ্ঞায়িত করার পরে, আপনি বিল্ট-ইন অ্যাট্রিবিউটের মতোই লেআউট XML ফাইলে
সেগুলি ব্যবহার করতে পারবেন। একমাত্র
পার্থক্য হল আপনার কাস্টম অ্যাট্রিবিউট অন্য নেমস্পেসের অন্তর্গত। http://schemas.android.com/apk/res/android নেমস্পেসের
পরিবর্তে, এগুলি http://schemas.android.com/apk/res/[your package name]-এর অন্তর্গত। যেমন, PieChart-এর জন্য
নির্ধারিত অ্যাট্রিবিউট কীভাবে ব্যবহার করতে হয়
তা এখানে দেওয়া হল:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
লম্বা নেমস্পেস URI বারবার ব্যবহার করা এড়াতে, স্যাম্পেলটি একটি
xmlns নির্দেশিকা ব্যবহার করে। এই নির্দেশিকা http://schemas.android.com/apk/res/com.example.customviews নেমস্পেসে
custom উপনাম অ্যাসাইন করে।
আপনার নেমস্পেসের জন্য আপনি যেকোনও অ্যালিয়াস বেছে নিতে পারেন।
লেআউটে কাস্টম ভিউ যোগ করে এমন XML ট্যাগের নাম লক্ষ্য করুন। এটি হল কাস্টম ভিউ ক্লাসের
সম্পূর্ণভাবে উপযুক্ত
নাম। আপনার ভিউ ক্লাস যদি ইনার ক্লাস হয়, তাহলে ভিউয়ের আউটার ক্লাসের নাম দিয়ে
আরও কোয়ালিফাই করুন।
যেমন, PieChart ক্লাসের মধ্যে PieView নামে একটি ইনার ক্লাস আছে। এই ক্লাস থেকে
কাস্টম অ্যাট্রিবিউট ব্যবহার করতে, আপনাকে
com.example.customviews.charting.PieChart$PieView ট্যাগ ব্যবহার করতে হবে।
কাস্টম অ্যাট্রিবিউট প্রয়োগ করুন
XML লেআউট থেকে কোনও ভিউ তৈরি করা হলে, XML ট্যাগের সব অ্যাট্রিবিউট রিসোর্স
বান্ডেল থেকে পড়া হয়
এবং ভিউয়ের কনস্ট্রাক্টরে
AttributeSet হিসেবে পাস করা হয়।
যদিও AttributeSet থেকে সরাসরি ভ্যালু
পড়া সম্ভব, তবে তা করলে
কিছু অসুবিধা হতে পারে:
- অ্যাট্রিবিউট ভ্যালুর মধ্যে রিসোর্স রেফারেন্স রিজলভ করা হয়নি।
- স্টাইল প্রয়োগ করা হয়নি।
পরিবর্তে, AttributeSet-কে
obtainStyledAttributes()-এ পাস করুন।
এই পদ্ধতিটি
TypedArray
অ্যারে অফ
ভ্যালু পাস করে যা
আগে থেকেই ডি-রেফারেন্স ও স্টাইল করা আছে।
Android রিসোর্স কম্পাইলার আপনার জন্য অনেক কাজ করে যাতে
obtainStyledAttributes()
কল করা সহজ হয়। res/ ডিরেক্টরিতে প্রতিটি <declare-styleable>
রিসোর্সের জন্য, জেনারেট করা R.java অ্যাট্রিবিউট আইডির অ্যারে এবং
কনস্ট্যান্টের সেট, দুটিই নির্ধারণ করে যা অ্যারেতে প্রতিটি অ্যাট্রিবিউটের জন্য ইন্ডেক্স নির্ধারণ করে। আপনি TypedArray থেকে
অ্যাট্রিবিউট পড়তে
আগে থেকে নির্ধারিত কনস্ট্যান্ট
ব্যবহার করেন। PieChart ক্লাস
কীভাবে এর অ্যাট্রিবিউট
পড়ে তা এখানে দেওয়া হল:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
জাভা
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
মনে রাখবেন যে TypedArray অবজেক্ট
হল একটি শেয়ার করা রিসোর্স
এবং ব্যবহারের পরে অবশ্যই রিসাইকেল করতে হবে।
প্রপার্টি ও ইভেন্ট যোগ করুন
ভিউয়ের আচরণ ও চেহারা নিয়ন্ত্রণ করার জন্য অ্যাট্রিবিউট হল একটি শক্তিশালী উপায়, কিন্তু
ভিউ শুরু করার সময়
শুধুমাত্র সেগুলি পড়া যায়। ডায়নামিক আচরণ প্রদান করতে, প্রতিটি কাস্টম অ্যাট্রিবিউটের জন্য
প্রপার্টি গেটার ও সেটার পেয়ার
দেখাতে হবে। নিচের স্নিপেট থেকে বোঝা যায় যে PieChart কীভাবে showText
নামক প্রপার্টি প্রকাশ করে:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
জাভা
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
লক্ষ্য করুন যে setShowText invalidate()
এবং requestLayout()-কে কল করে। ভিউ যাতে নির্ভরযোগ্যভাবে কাজ করে তা নিশ্চিত করার জন্য
এইসব কল অত্যন্ত গুরুত্বপূর্ণ। প্রপার্টিতে এমন কোনও পরিবর্তন করার পরে আপনাকে
ভিউ বাতিল করতে হবে যা এটির
চেহারা পরিবর্তন করতে পারে, যাতে
সিস্টেম বুঝতে পারে যে এটি আবার আঁকতে হবে। একইভাবে, আপনাকে নতুন লেআউটের জন্য অনুরোধ করতে হবে যদি
কোনও প্রপার্টি এমনভাবে পরিবর্তিত হয়
যা ভিউয়ের সাইজ বা আকারকে প্রভাবিত করতে পারে। এইসব মেথড কল ভুলে গেলে
সহজে খুঁজে পাওয়া যায় না এমন
সমস্যা হতে পারে।
গুরুত্বপূর্ণ ইভেন্ট সম্পর্কে জানাতে কাস্টম ভিউতে ইভেন্ট লিসেনারও থাকতে হবে। যেমন, PieChart
OnCurrentItemChanged নামক একটি কাস্টম ইভেন্ট প্রকাশ করে যাতে শ্রোতারা জানতে পারেন যে
ব্যবহারকারী পাই চার্টটি ঘুরিয়ে
নতুন পাই স্লাইসের উপর ফোকাস করেছেন।
প্রপার্টি ও ইভেন্ট এক্সপোজ করতে ভুলে যাওয়া সহজ, বিশেষ করে আপনি যদি কাস্টম ভিউয়ের একমাত্র ব্যবহারকারী হন। আপনার ভিউয়ের ইন্টারফেস যত্ন সহকারে সংজ্ঞায়িত করার জন্য সময় নিলে ভবিষ্যতে রক্ষণাবেক্ষণের খরচ কমে। একটি ভাল নিয়ম হল, আপনার কাস্টম ভিউয়ের দৃশ্যমান চেহারা বা আচরণকে প্রভাবিত করে এমন যেকোনও প্রপার্টি সবসময় এক্সপোজ করা।
অ্যাক্সেসিবিলিটির জন্য ডিজাইন করা
আপনার কাস্টম ভিউতে বিভিন্ন ধরনের ব্যবহারকারীর জন্য সুবিধা থাকতে হবে। এর মধ্যে এমন ব্যবহারকারীরাও অন্তর্ভুক্ত আছেন যাদের শারীরিক প্রতিবন্ধকতা টাচস্ক্রিন দেখতে বা ব্যবহার করতে বাধা দেয়। দিব্যাঙ্গ ব্যবহারকারীদের সহায়তা করতে, নিম্নলিখিত কাজগুলি করুন:
android:contentDescriptionঅ্যাট্রিবিউট ব্যবহার করে আপনার ইনপুট ফিল্ডে লেবেল যোগ করুন।- প্রয়োজন হলে
sendAccessibilityEvent()কল করে অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান। - ডি-প্যাড বা ট্র্যাকবলের মতো বিকল্প কন্ট্রোলার কাজ করে।
অ্যাক্সেসযোগ্য ভিউ তৈরি করার ব্যাপারে আরও তথ্যের জন্য, অ্যাপ আরও অ্যাক্সেসযোগ্য করুন দেখুন।