অ্যাপের সাথে ইন্টার্যাক্ট করার জন্য টিভি ডিভাইসের সেকেন্ডারি হার্ডওয়্যার ডিভাইস প্রয়োজন—একটি বেসিক রিমোট কন্ট্রোলার, পয়েন্টার রিমোট বা গেম কন্ট্রোলার। ব্যবহারকারীকে ধারাবাহিক অভিজ্ঞতা প্রদান করতে, আপনার অ্যাপকে অবশ্যই ডিরেকশনাল প্যাড (D-প্যাড) ইনপুট সাপোর্ট করতে হবে, অফলাইনে যাওয়া কন্ট্রোলার ম্যানেজ করতে হবে এবং পয়েন্টার রিমোট সহ একাধিক কন্ট্রোলারের ধরন থেকে ইনপুট সাপোর্ট করতে হবে।
ডি-প্যাডের ন্যূনতম কন্ট্রোল
টিভি ডিভাইসের জন্য ডিফল্ট কন্ট্রোলার হল ডি-প্যাড। সাধারণত, আপনার অ্যাপটি এমন একটি রিমোট কন্ট্রোলার থেকে অপারেট করা যেতে হবে যাতে শুধুমাত্র উপরে, নিচে, বামে, ডানে, বেছে নিন, ফিরে যান এবং হোম বোতাম রয়েছে। আপনার অ্যাপটি যদি এমন কোনও গেম হয় যার জন্য সাধারণত অতিরিক্ত কন্ট্রোল সহ গেম কন্ট্রোলার প্রয়োজন হয়, তাহলে শুধুমাত্র এইসব ডি-প্যাড কন্ট্রোল ব্যবহার করে গেমপ্লে সাপোর্ট করার চেষ্টা করুন। অন্যথায়, ব্যবহারকারীকে সতর্ক করুন যে কন্ট্রোলার প্রয়োজন এবং তাকে ডি-প্যাড কন্ট্রোলার ব্যবহার করে আপনার গেম থেকে বেরিয়ে আসতে দিন।
টিভি ডিভাইসের জন্য ডি-প্যাড কন্ট্রোলারের মাধ্যমে নেভিগেশন সম্পর্কে আরও তথ্যের জন্য, টিভি নেভিগেশন দেখুন।
কন্ট্রোলার ডিসকানেক্ট হয়ে গেলে কী করতে হবে তা ম্যানেজ করুন
টিভির কন্ট্রোলার প্রায়শই ব্লুটুথ ডিভাইস হয়, যা মাঝে মাঝে স্লিপ মোডে গিয়ে এবং টিভি ডিভাইস থেকে ডিসকানেক্ট হয়ে পাওয়ার সেভ করার চেষ্টা করতে পারে। এর অর্থ হল, কোনও অ্যাপ যদি এই রিকানেক্ট ইভেন্ট ম্যানেজ করার জন্য কনফিগার করা না থাকে, তাহলে সেটি বাধাগ্রস্ত হতে পারে বা রিস্টার্ট হতে পারে। এইসব ঘটনা নিম্নলিখিত যেকোনও পরিস্থিতিতে ঘটতে পারে:
- কয়েক মিনিট দীর্ঘ ভিডিও চালানোর সময়, ডি-প্যাড বা গেম কন্ট্রোলার স্লিপ মোডে চলে যেতে পারে, টিভি ডিভাইস থেকে ডিসকানেক্ট হয়ে যেতে পারে এবং পরে আবার কানেক্ট হতে পারে।
- গেমপ্লে চলাকালীন, কোনও নতুন প্লেয়ার গেম কন্ট্রোলার ব্যবহার করে গেমে যোগ দিতে পারেন যা আগে থেকে কানেক্ট করা নেই।
- গেমপ্লে চলাকালীন, কোনও প্লেয়ার গেম থেকে বেরিয়ে আসতে এবং গেম কন্ট্রোলার ডিসকানেক্ট করতে পারেন।
ডিসকানেক্ট ও রিকানেক্ট ইভেন্টের সাথে সম্পর্কিত যেকোনও TV অ্যাপ অ্যাক্টিভিটি, অ্যাপ ম্যানিফেস্টে রিকানেকশন ইভেন্ট ম্যানেজ করার জন্য কনফিগার করতে হবে। নিম্নলিখিত কোড স্যাম্পেল থেকে বোঝা যায় যে কীভাবে কনফিগারেশন পরিবর্তন ম্যানেজ করার জন্য অ্যাক্টিভিটি চালু করতে হয়, যার মধ্যে কীবোর্ড বা নেভিগেশন ডিভাইস কানেক্ট, ডিসকানেক্ট বা আবার কানেক্ট করা অন্তর্ভুক্ত:
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|navigation"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
...
</activity>
এই কনফিগারেশন পরিবর্তন করার ফলে, অ্যাপটি রিকানেকশন ইভেন্টের মাধ্যমে রান করা চালিয়ে যেতে পারে—Android ফ্রেমওয়ার্কের মাধ্যমে রিস্টার্ট করার প্রয়োজন হয় না, যা ব্যবহারকারীর জন্য ভালো অভিজ্ঞতা নয়।
ডি-প্যাড ইনপুট ভেরিয়েশন ম্যানেজ করা
টিভি ডিভাইস ব্যবহারকারীদের কাছে একাধিক ধরনের কন্ট্রোলার থাকতে পারে যা তারা টিভির সাথে ব্যবহার করেন। যেমন, কোনও ব্যবহারকারীর কাছে বেসিক ডি-প্যাড কন্ট্রোলার, পয়েন্টার রিমোট বা গেম কন্ট্রোলার থাকতে পারে। ডি-প্যাড ফাংশনের জন্য গেম কন্ট্রোলার ব্যবহার করা হলে, সেটির পাঠানো কী কোড, সাধারণ ডি-প্যাডের পাঠানো কী কোডের থেকে আলাদা হতে পারে।
ডি-প্যাড ইনপুটের বিভিন্নতা ম্যানেজ করুন যাতে ব্যবহারকারীকে আপনার অ্যাপ অপারেট করার জন্য কন্ট্রোলার পরিবর্তন করতে না হয়। ইনপুটের বিভিন্নতা ম্যানেজ করার ব্যাপারে আরও তথ্যের জন্য, ডিরেকশনাল প্যাড ইনপুট প্রসেস করুন দেখুন।
পয়েন্টার রিমোটের জন্য সহায়তা
কিছু টিভি ডিভাইসে পয়েন্টার রিমোট কাজ করে, যেমন এয়ার মাউস বা টাচ-সেনসিটিভ ডিরেকশনাল প্যাড (ট্র্যাকপ্যাড) সহ রিমোট। পয়েন্টার রিমোটের সুবিধা থাকলে ব্যবহারকারীরা পয়েন্ট-অ্যান্ড-ক্লিক, হোভার, সোয়াইপ ও ড্র্যাগ জেসচার ব্যবহার করে আপনার অ্যাপের সাথে ইন্টার্যাক্ট করতে পারেন। এর ফলে সম্পূর্ণ ডি-প্যাড কম্প্যাটিবিলিটি বজায় রেখেও মানানসই হার্ডওয়্যারে আরও সাবলীল অভিজ্ঞতা প্রদান করা যায়।
ম্যানিফেস্টে পয়েন্টার রিমোট সাপোর্ট ঘোষণা করুন
আপনার অ্যাপ যে পয়েন্টার ও টাচ ইনপুটের মাধ্যমে নেভিগেট করা যায় তা বোঝাতে,
আপনার অ্যাপ ম্যানিফেস্ট কনফিগার করুন, যেখানে <application> এলিমেন্টের মধ্যে (অথবা প্রতিটি অ্যাক্টিভিটির জন্য
সাপোর্ট কনফিগার করতে আলাদা আলাদা <activity> এলিমেন্টের মধ্যে) true-এ android.software.leanback.supports_touch
<property> সেট করা থাকবে:
<manifest ...>
<!-- Signal whether the app is adaptive or built just for TV -->
<uses-feature
android:name="android.software.leanback"
android:required="true|false" />
<!-- Ensure the app can be installed on conventional TVs -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<application ...>
<!-- Signal whether the app supports pointer remotes -->
<property
android:name="android.software.leanback.supports_touch"
android:value="true" />
...
</application>
</manifest>
ক্লিক, হোভার ও স্ক্রল ইন্টার্যাকশন কাজ করে
পয়েন্টার রিমোটের ক্ষেত্রে, আপনার UI কম্পোনেন্ট যাতে নিম্নলিখিত ইন্টার্যাকশন জুড়ে কার্সর ও টাচ ইনপুটে সঠিকভাবে রেসপন্স করে তা নিশ্চিত করুন:
- ক্লিক ও বেছে নেওয়া: ফোকাস করা ও বেছে নেওয়া যায় এমন সব UI এলিমেন্ট
পয়েন্টার রিমোটের মাধ্যমে ক্লিক করার উপযুক্ত হতে হবে, যা ডি-প্যাড বেছে নেওয়ার (
KEYCODE_DPAD_CENTER) আচরণের সাথে ম্যাচ করে।- Jetpack Compose:
Modifier.clickable()বাpointerInputমডিফায়ার ব্যবহার করুন। আরও জানতে, ট্যাপ ও প্রেস করুন বিকল্প দেখুন। - Views: ভিউতে ক্লিক ইভেন্ট হ্যান্ডেল করে। আরও জানতে, ইনপুট ইভেন্টের ওভারভিউ দেখুন।
- Jetpack Compose:
- ভিজ্যুয়াল হোভার স্টেট: বেছে নেওয়া যায় এমন আইটেমের উপর পয়েন্টার কার্সর থাকলে,
সেটি বোঝাতে স্পষ্ট ভিজ্যুয়াল হোভার এফেক্ট প্রদান করুন।
- Jetpack Compose:
Modifier.hoverable()ব্যবহার করুন অথবাInteractionSourceব্যবহার করে হোভার স্টেট লক্ষ্য করুন। আরও জানতে, ব্যবহারকারীর ইন্টার্যাকশন ম্যানেজ করা দেখুন। - ভিউ: স্টেট-লিস্ট ড্রয়েবল ব্যবহার করে হোভার স্টেটকে সংজ্ঞায়িত করুন, সাথে
android:state_hovered="true"।
- Jetpack Compose:
- সোয়াইপ ও ফ্লিং স্ক্রলিং: টাচ-সেনসিটিভ সেন্টার ডি-প্যাড বোতামে সোয়াইপ বা ফ্লিং জেসচারের মাধ্যমে ট্রিগার করা অনুভূমিক ও উল্লম্ব স্ক্রলিং অবশ্যই সব স্ক্রলযোগ্য কন্টেন্ট জুড়ে মসৃণভাবে কাজ করতে হবে।
- টেনে স্ক্রল করা: ব্যবহারকারীদের স্ক্রল করা যায় এমন কন্টেনারে উল্লম্বভাবে (উপরে ও
নিচে) বা অনুভূমিকভাবে (বাঁদিকে ও ডানদিকে) টেনে স্ক্রল করার সুবিধা দিতে হবে।
- Jetpack Compose: স্ট্যান্ডার্ড স্ক্রল করা যায় এমন কন্টেনারে ডিফল্ট হিসেবে পয়েন্টার ও টাচ স্ক্রলিং কাজ করে। কাস্টম প্রয়োগের জন্য, Compose-এ পয়েন্টার ইনপুট দেখুন।
- ভিউ: স্ট্যান্ডার্ড স্ক্রলযোগ্য ভিউ ডিফল্ট হিসেবে টাচ স্ক্রলিং সাপোর্ট করে। কাস্টম ইনপুট হ্যান্ডলিংয়ের জন্য, টাচ ও ইনপুট দেখুন।
- মিডিয়া প্লেব্যাক স্ক্রাবিং: মিডিয়া প্লেব্যাক চলাকালীন (যেমন, টিভি শো এবং সিনেমা), ব্যবহারকারীকে প্লেব্যাক প্রোগ্রেস বারের (সিক বার) সাথে ইন্টার্যাক্ট করতে পারতে হবে। এর জন্য তাকে পয়েন্ট ও ক্লিক করে আগের বা পরের টাইমস্ট্যাম্পে যেতে পারতে হবে, সেইসাথে প্রোগ্রেস বার টেনে (স্ক্রাব করে) নির্দিষ্ট সময়ে যেতে পারতে হবে।
বোতাম ইভেন্ট ম্যানেজ করুন
ব্যবহারকারী কন্ট্রোলারের কোনও বোতামে ক্লিক করলে, আপনার অ্যাপ KeyEvent সহ একটি ইভেন্ট
রিসিভ করে। বোতামের উদ্দেশ্যমূলক আচরণ একটি মিডিয়া ইভেন্ট হতে পারে,
যেমন প্লে, পজ বা স্টপ, অথবা এটি একটি টিভি-টাইপ ইভেন্ট হতে পারে, যেমন নির্বাচন বা
নেভিগেশন। ব্যবহারকারীকে ভালো অভিজ্ঞতা প্রদান করার জন্য, কন্ট্রোলার বোতামে
একই ধরনের আচরণ অ্যাসাইন করুন।
TV UI ইভেন্ট
নিচের সারণীতে দেখানো KeyEvent ধরনের বোতামে টিভি UI আচরণ অ্যাসাইন করুন:
KeyEvent |
আচরণ |
|---|---|
KEYCODE_BUTTON_B, KEYCODE_BACK |
ফিরে যান |
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
বেছে নেওয়া |
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT |
নেভিগেশন |
মিডিয়া ইভেন্ট
ব্যবহারকারী মিডিয়া দেখার সময়, নিচের সারণীতে দেখানো KeyEvent ধরনের বোতামে
আচরণ অ্যাসাইন করুন। আপনার অ্যাপ যদি কোনও
MediaSession কন্ট্রোল করে, তাহলে সারণীতে দেখানো MediaControllerCompat.TransportControls মেথডের মধ্যে কোনও একটিকে কল করতে MediaControllerAdapter ব্যবহার করুন। মনে রাখবেন যে
এই প্রসঙ্গে বেছে নেওয়ার বোতামগুলি প্লে বা পজ বোতাম হিসেবে কাজ করে।
KeyEvent |
TransportControls কল | আচরণ |
|---|---|---|
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
play() |
চালান |
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
pause() |
পজ করুন |
BUTTON_R1 |
skipToNext() |
এগিয়ে যাওয়ার জন্য এড়িয়ে যান |
BUTTON_L1 |
skipToPrevious() |
পিছনে যাওয়ার জন্য এড়িয়ে যান |
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE |
fastForward() |
ফাস্ট ফরওয়ার্ড |
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE |
rewind() |
রিওয়াইন্ড করুন |
| N/A | stop() |
বন্ধ করুন |
'ফিরে যান' বোতামের উপযুক্ত আচরণ প্রদান করুন
'ফিরে যান' বোতামটি কখনই টগল হিসেবে কাজ করবে না। যেমন, মেনু খোলা ও বন্ধ করা, দুটির জন্যই এটি ব্যবহার করবেন না। প্লেয়ার আগে যেসব স্ক্রিনে ছিল, সেগুলিতে ব্রেডক্রাম্ব-স্টাইলে ফিরে যাওয়ার জন্য এটি ব্যবহার করুন।
যেহেতু 'ফিরে যান' বোতামটি শুধুমাত্র লিনিয়ার, ব্যাকওয়ার্ড নেভিগেশন পারফর্ম করে, তাই আপনি এটি ব্যবহার করতে পারেন অন্য বোতামের মাধ্যমে খোলা অ্যাপ-মধ্যস্থ মেনু থেকে বেরিয়ে আসতে এবং অ্যাপে ফিরে যেতে। 'ফিরে যান' বোতামটি পরপর প্রেস করলে, তা সবসময় অবশেষে Android TV হোম স্ক্রিনে নিয়ে যাবে। যেমন: গেম খেলা > গেম পজ স্ক্রিন > গেমের প্রধান স্ক্রিন > Android TV হোম স্ক্রিন অথবা টিভি শো চালানো > TV অ্যাপের প্রধান স্ক্রিন
Android TV হোম স্ক্রিন।
নেভিগেশনের জন্য ডিজাইন সম্পর্কে আরও তথ্যের জন্য, ব্যাক এবং আপ নেভিগেশন ডিজাইন করা দেখুন। প্রয়োগ সম্পর্কে জানতে, সঠিক ব্যাক নেভিগেশন প্রদান করা দেখুন।
গেমের জন্য কন্ট্রোলার হ্যান্ডেল করা
Android TV-এর জন্য গেম তৈরি করার সময়, স্ট্যান্ডার্ড টিভি রিমোট এবং ডেডিকেটেড গেম কন্ট্রোলার, উভয়ের সাথেই কাজ করার জন্য আপনার কন্ট্রোল স্কিম ডিজাইন করুন।
ডি-প্যাড কন্ট্রোল কাজ করে
ডি-প্যাড কন্ট্রোলের চারপাশে আপনার কন্ট্রোল স্কিম প্ল্যান করুন, কারণ এই কন্ট্রোল সেটটি Android TV ডিভাইসের জন্য ডিফল্ট। প্লেয়ারকে গেমের সব দিক থেকে ডি-প্যাড ব্যবহার করতে পারতে হবে—শুধু মূল গেমপ্লে নিয়ন্ত্রণ করাই নয়, মেনু এবং বিজ্ঞাপন নেভিগেট করাও। এই কারণে, আপনার Android TV গেমে "চালিয়ে যেতে এখানে ট্যাপ করুন" এই ধরনের ভাষা ব্যবহার করে টাচ ইন্টারফেসের উল্লেখ করবেন না।
কন্ট্রোলারের সাথে প্লেয়ারের ইন্টার্যাকশন আপনি কীভাবে ডিজাইন করছেন তার উপর ব্যবহারকারীর অভিজ্ঞতা নির্ভর করে। নিম্নলিখিত পেশাদার পদ্ধতিগুলি বিবেচনা করুন:
- কন্ট্রোলার সংক্রান্ত প্রয়োজনীয়তা আগে থেকে জানিয়ে দিন: কন্ট্রোলার সম্পর্কে কোনও প্রত্যাশা থাকলে তা প্লেয়ারকে জানাতে Google Play বিবরণ ব্যবহার করুন। কোনও গেম যদি শুধু ডি-প্যাড থাকা গেমপ্যাডের চেয়ে জয়স্টিক থাকা গেমপ্যাডের জন্য বেশি উপযুক্ত হয়, তাহলে সেটি স্পষ্টভাবে উল্লেখ করুন। কোনও গেমের জন্য অনুপযুক্ত কন্ট্রোলার ব্যবহার করলে, প্লেয়ারের অভিজ্ঞতা খারাপ হতে পারে এবং তিনি আপনার গেমকে খারাপ রেটিং দিতে পারেন।
- একই ধরনের বোতাম ম্যাপিং ব্যবহার করুন: ব্যবহারকারীকে ভালো অভিজ্ঞতা দেওয়ার জন্য সহজ বোতাম ম্যাপিং অত্যন্ত গুরুত্বপূর্ণ। যেমন, গ্রহণ করতে A বোতাম এবং বাতিল করতে B বোতাম ব্যবহার করার মতো স্বীকৃত প্রথা মেনে চলুন। এছাড়াও, ব্যবহারকারীকে বোতাম রিম্যাপ করার অনুমতি দিয়ে আপনি ফ্লেক্সিবিলিটি অফার করতে পারেন। বোতাম ম্যাপিং সম্পর্কে আরও তথ্যের জন্য, কন্ট্রোলার অ্যাকশন ম্যানেজ করুন দেখুন।
- কন্ট্রোলারের ক্ষমতা শনাক্ত করা এবং সেই অনুযায়ী অ্যাডজাস্ট করা: কন্ট্রোলার এবং গেমের মধ্যে ম্যাচ অপ্টিমাইজ করার জন্য কন্ট্রোলারের ক্ষমতা সম্পর্কে কোয়েরি করা। যেমন, আপনি হয়ত চান যে কোনও প্লেয়ার যেন কন্ট্রোলারটি বাতাসে নাড়িয়ে কোনও অবজেক্টকে চালনা করে, কিন্তু প্লেয়ারের কন্ট্রোলারে যদি অ্যাক্সেলেরোমিটার এবং জাইরোস্কোপ হার্ডওয়্যার না থাকে, তাহলে নাড়িয়ে কোনও কাজ হবে না। কন্ট্রোলারকে কোয়েরি করুন এবং মোশন ডিটেকশন কাজ না করলে, অন্য কোনও উপলভ্য কন্ট্রোল স্কিমে পাল্টে নিন। কন্ট্রোলারের ক্ষমতা কোয়েরি করা সম্পর্কে আরও তথ্যের জন্য, Android ভার্সন জুড়ে কন্ট্রোলার সাপোর্ট দেখুন।
উপযুক্ত বোতাম ব্যবহার করুন
সব গেম কন্ট্রোলারে 'শুরু করুন', 'সার্চ করুন' বা 'মেনু' বোতাম থাকে না। আপনার UI যাতে এইসব বোতামের ব্যবহারের উপর নির্ভর না করে তা নিশ্চিত করুন।
একাধিক কন্ট্রোলার ম্যানেজ করা
একাধিক প্লেয়ার যখন কোনও গেম খেলেন, তখন প্রত্যেকের নিজস্ব কন্ট্রোলার থাকে, তাই
প্রতিটি প্লেয়ার-কন্ট্রোলার পেয়ার ম্যাপ করা গুরুত্বপূর্ণ। কন্ট্রোলার-নম্বর শনাক্তকরণ কীভাবে
প্রয়োগ করবেন সেই সম্পর্কে তথ্য পেতে, getControllerNumber() দেখুন।
কন্ট্রোলার ডিসকানেক্ট হয়ে গেলে তা ম্যানেজ করা
গেমপ্লে চলাকালীন কন্ট্রোলার ডিসকানেক্ট হয়ে গেলে, গেম পজ করুন এবং ডিসকানেক্ট হয়ে যাওয়া প্লেয়ারকে কন্ট্রোলার আবার কানেক্ট করার জন্য প্রম্পট করে একটি ডায়ালগ দেখান।
এছাড়াও, ডায়ালগে সমস্যার সমাধান সংক্রান্ত পরামর্শ দিন। যেমন, প্লেয়ারকে বলুন, "আপনার ব্লুটুথ কানেকশন চেক করুন।" ইনপুট-ডিভাইস সাপোর্ট প্রয়োগ করা সম্পর্কে আরও তথ্য পেতে, কন্ট্রোলার অ্যাকশন ম্যানেজ করা এবং ব্লুটুথ ওভারভিউ দেখুন।
কন্ট্রোলার সংক্রান্ত নির্দেশাবলী দেখুন
আপনার গেম যদি ভিজ্যুয়াল গেম কন্ট্রোল সংক্রান্ত নির্দেশাবলী প্রদান করে, তাহলে ব্র্যান্ডিং মুক্ত একটি কন্ট্রোলার ইমেজ ব্যবহার করুন এবং শুধুমাত্র Android-এর সাথে মানানসই বোতাম অন্তর্ভুক্ত করুন।
Android-এর সাথে মানানসই কন্ট্রোলারের স্যাম্পেল ছবি দেখতে, Android TV গেমপ্যাড টেমপ্লেট (ZIP) ডাউনলোড করুন। এতে কালো ব্যাকগ্রাউন্ডে সাদা কন্ট্রোলার এবং সাদা ব্যাকগ্রাউন্ডে কালো কন্ট্রোলার অন্তর্ভুক্ত থাকে—যা ছবি ১-এ দেখানো হয়েছে—PNG ফাইল এবং Adobe® Illustrator® ফাইল হিসেবে।