دستگاههای تلویزیون برای تعامل با برنامهها به یک دستگاه سختافزاری ثانویه نیاز دارند—یک کنترل از راه دور پایه، کنترل از راه دور اشارهگر، یا کنترل بازی. برای ارائه تجربه کاربری یکپارچه، برنامهتان باید از ورودی پد کنترل (D-pad) پشتیبانی کند، کنترلرهای آفلاین را مدیریت کند، و از ورودی انواع مختلف کنترلر، ازجمله کنترل ازراهدور اشارهگر، پشتیبانی کند.
حداقل کنترلهای پد کنترل
کنترلکننده پیشفرض برای دستگاه تلویزیون پد کنترل است. بهطور کلی، برنامه شما باید ازطریق کنترل از راه دوری که فقط دکمههای بالا، پایین، چپ، راست، انتخاب، «برگشت»، و «صفحه اصلی» را دارد قابلاجرا باشد. اگر برنامهتان بازیای است که معمولاً به دسته کنترل بازی با کنترلهای اضافی نیاز دارد، سعی کنید از روال بازی فقط با این کنترلهای پد کنترل پشتیبانی کنید. درغیراینصورت، به کاربر هشدار دهید که کنترلکننده لازم است و به او اجازه دهید بااستفاده از کنترلکننده پد کنترل بهراحتی از بازی خارج شود.
برای اطلاعات بیشتر درباره پیمایش با کنترلکنندههای پد کنترل برای دستگاههای تلویزیون، به پیمایش تلویزیون مراجعه کنید.
مدیریت قطع شدن اتصال کنترلکننده
کنترلکنندههای تلویزیون اغلب دستگاههای بلوتوث هستند که ممکن است برای صرفهجویی در مصرف برق، بهطور دورهای به حالت خواب بروند و اتصالشان از دستگاه تلویزیون قطع شود. این یعنی اگر برنامهای برای مدیریت این رویدادهای اتصال مجدد پیکربندی نشده باشد، ممکن است قطع یا بازراهاندازی شود. این رویدادها ممکن است در هریک از شرایط زیر اتفاق بیفتد:
- درحین پخش ویدیویی که چند دقیقه طول میکشد، ممکن است پد کنترل یا کنترل بازی به حالت خواب برود، اتصالش با دستگاه تلویزیون قطع شود، و بعداً دوباره متصل شود.
- درطول بازی، ممکن است بازیکن جدیدی بااستفاده از کنترلکننده بازیای که ازقبل متصل نشده است به بازی بپیوندد.
- درحین بازی، ممکن است بازیکن بازی را ترک کند و اتصال کنترل بازی را قطع کند.
هرگونه فعالیت برنامه تلویزیون که مشمول رویدادهای قطع و وصل شدن اتصال است باید بهگونهای پیکربندی شود که رویدادهای اتصال مجدد را در مانیفست برنامه مدیریت کند. نمونه کد زیر نشان میدهد که چگونه میتوان فعالیتی را برای مدیریت تغییرات پیکربندی فعال کرد، ازجمله اتصال، قطع اتصال، یا اتصال مجدد صفحهکلید یا دستگاه پیمایش:
<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 بازراهاندازی شود، که تجربه کاربری خوبی نیست.
مدیریت کردن گونههای ورودی پد کنترل
کاربران دستگاه تلویزیون ممکن است بیشاز یک نوع کنترلکننده داشته باشند که از آن برای تلویزیونشان استفاده میکنند. برای مثال، کاربر ممکن است یک کنترلر پد کنترل پایه، یک کنترل از راه دور اشارهگر، یا یک کنترلر بازی داشته باشد. کدهای کلیدی که کنترلکننده بازی هنگام استفاده برای عملکردهای پد کنترل ارائه میدهد ممکن است با کدهای کلیدی که پد کنترل پایه ارسال میکند متفاوت باشد.
تغییرات ورودی پد کنترل را مدیریت کنید تا کاربر مجبور نباشد برای کار با برنامهتان کنترلکنندهها را تغییر دهد. برای اطلاعات بیشتر درباره مدیریت تغییرات ورودی، پردازش ورودی پد کنترل را ببینید.
پشتیبانی از کنترل از راه دور اشارهگر
برخیاز دستگاههای تلویزیون از کنترل ازراهدور اشارهگر پشتیبانی میکنند، مانند ماوس هوایی یا کنترل ازراهدور با پد جهتنمای حساس به لمس (پد لمسی). پشتیبانی از کنترل ازراهدور اشارهگر به کاربران امکان میدهد بااستفاده از اشاره کردن و کلیک کردن، نگه داشتن نشانگر، تند کشیدن، و اشارههای کشیدن با برنامه شما تعامل برقرار کنند و تجربه روانتری در سختافزار سازگار ارائه میدهد و درعینحال سازگاری کامل با پد کنترل را حفظ میکند.
اعلام پشتیبانی از کنترل از راه دور اشارهگر در مانیفست
برای نشان دادن اینکه برنامه شما با ورودی لمسی و اشارهگر قابلپیمایش است،
مانیفست برنامهتان را با android.software.leanback.supports_touch
<property> تنظیمشده روی true در عنصر <application> (یا در
عناصر <activity> جداگانه برای پیکربندی پشتیبانی برای هر فعالیت) پیکربندی کنید:
<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>
پشتیبانی از تعاملات کلیک، نگه داشتن نشانگر، و پیمایش
هنگام پشتیبانی از کنترل ازراهدور اشارهگر، مطمئن شوید مؤلفههای میانای کاربری شما بهطور مناسب به ورودی مکاننما و لمسی در تعاملهای زیر پاسخ میدهند:
- کلیک و انتخاب: همه عناصر واسط کاربر قابلانتخاب و قابلتمرکز باید با کنترل ازراهدور اشارهگر قابلکلیک باشند و با رفتار انتخاب پد کنترل (
KEYCODE_DPAD_CENTER) مطابقت داشته باشند.- Jetpack Compose: از اصلاحکنندههای
Modifier.clickable()یاpointerInputاستفاده کنید. برای جزئیات بیشتر، به تکضرب زدن و فشار دادن مراجعه کنید. - نماها: رویدادهای کلیک روی نماها را مدیریت میکند. برای جزئیات بیشتر، نمای کلی رویدادهای ورودی را ببینید.
- Jetpack Compose: از اصلاحکنندههای
- حالتهای نگه داشتن نشانگر: جلوه دیداری واضحی برای نگه داشتن نشانگر ارائه دهید تا مشخص شود
چه زمانی مکاننما روی موردی قابلانتخاب قرار گرفته است.
- Jetpack Compose: از
Modifier.hoverable()استفاده کنید یا حالتهای نگه داشتن روی صفحه را بااستفاده ازInteractionSourceمشاهده کنید. برای جزئیات بیشتر، مدیریت تعاملات کاربر را ببینید. - نماها: حالتهای نگه داشتن نشانگر را بااستفاده از ترسیمشدنیهای فهرست حالت با
android:state_hovered="true"تعریف کنید.
- Jetpack Compose: از
- پیمایش با تند کشیدن و پرتاب کردن: پیمایش افقی و عمودی که با اشاره تند کشیدن یا پرتاب کردن روی دکمه میانی پد کنترل حساس به لمس فعال میشود باید بهطور روان در سراسر محتوای پیمایششدنی کار کند.
- پیمایش با کشیدن: کاربران باید بتوانند با کشیدن، بهصورت عمودی (بالا و پایین) یا افقی (چپ و راست) در محفظههای پیمایششدنی پیمایش کنند.
- Jetpack Compose: محفظههای پیمایشی استاندارد بهطور پیشفرض از پیمایش با اشارهگر و لمس پشتیبانی میکنند. برای پیادهسازیهای سفارشی، ورودی اشارهگر در Compose را ببینید.
- نماها: نماهای پیمایشی استاندارد بهطور پیشفرض از پیمایش لمسی پشتیبانی میکنند. برای مدیریت ورودی سفارشی، لمس و ورودی را ببینید.
- پیمایش بازپخش رسانه: درطول بازپخش رسانه (مانند نمایشهای تلویزیونی و فیلمها)، کاربران باید بتوانند با نوار پیشرفت بازپخش (نوار کاوش) تعامل داشته باشند، به این صورت که با اشاره و کلیک کردن به مُهر زمان گذشته یا آینده بپرند، و همچنین با کشیدن (پیمایش) درطول نوار پیشرفت به زمان خاصی بروند.
مدیریت رویدادهای دکمه
وقتی کاربر روی دکمهای در کنترلکننده کلیک میکند، برنامه شما رویدادی با
KeyEvent دریافت میکند. رفتار موردنظر برای دکمه ممکن است رویداد رسانهای باشد،
مثل پخش، مکث، یا توقف، یا ممکن است رویدادی از نوع تلویزیون باشد، مثل انتخاب یا
پیمایش. برای ارائه تجربه کاربری خوب، رفتار ثابتی به دکمههای کنترلکننده اختصاص دهید.
رویدادهای واسط کاربر تلویزیون
رفتار واسط کاربر تلویزیون را به دکمههایی که انواع KeyEvent را تولید میکنند اختصاص دهید، همانطور که در جدول زیر نشان داده شده است:
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 را کنترل میکند، از MediaControllerAdapter برای فراخوانی یکی از
MediaControllerCompat.TransportControls روشهای نشاندادهشده در جدول استفاده کنید. توجه داشته باشید که
دکمههای انتخاب در این زمینه بهعنوان دکمههای «پخش» یا «مکث» عمل میکنند.
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() |
عقب بردن |
| موجود نیست | stop() |
ایست |
ارائه رفتار مناسب برای دکمه «برگشت»
دکمه «برگشت» هرگز نباید بهعنوان کلید روشن/خاموش عمل کند. برای مثال، از آن هم برای باز کردن و هم برای بستن منو استفاده نکنید. فقط از آن برای پیمایش به عقب، به سبک ردپا، در صفحههای قبلی که بازیکن در آنها بوده است استفاده کنید.
ازآنجاییکه دکمه «برگشت» فقط پیمایش خطی و رو به عقب را انجام میدهد، میتوانید از آن برای خروج از منو درونبرنامه که با دکمه دیگری باز شده است و بازگشت به برنامه استفاده کنید. فشردن متوالی دکمه «برگشت» باید همیشه درنهایت به صفحه اصلی Android TV منتهی شود. برای مثال: بازی کردن > صفحه توقف بازی > صفحه اصلی بازی > صفحه اصلی Android TV یا پخش نمایش تلویزیونی > صفحه اصلی برنامه تلویزیون
صفحه اصلی Android TV.
برای اطلاعات بیشتر درباره طراحی برای پیمایش، به طراحی پیمایش «برگشت» و «بالا» مراجعه کنید. برای آشنایی با پیادهسازی، به ارائه پیمایش به عقب مناسب مراجعه کنید.
کنترلرهای دسته برای بازیها
هنگام ساختن بازی برای Android TV، طرح کنترل خود را بهگونهای طراحی کنید که هم با کنترل از راه دور استاندارد تلویزیون و هم با کنترلکنندههای اختصاصی بازی کار کند.
پشتیبانی از کنترلهای پد کنترل
طرح کنترل خود را براساس کنترل پد کنترل برنامهریزی کنید، زیرا این مجموعه کنترل برای دستگاههای Android TV پیشفرض است. بازیکن باید بتواند از پد کنترل برای همه جنبههای بازی استفاده کند—نه فقط برای کنترل روند بازی اصلی، بلکه برای پیمایش منوها و آگهیها. به همین دلیل، مطمئن شوید که بازی Android TV شما با عباراتی مثل «برای ادامه، اینجا تکضرب بزنید» به میانای لمسی اشاره نکند.
نحوه شکل دادن به تعامل بازیکن با کنترلکننده میتواند کلید دستیابی به تجربه کاربری عالی باشد. روالهای مطلوب زیر را درنظر بگیرید:
- الزامات کنترلکننده را ازقبل اعلام کنید: از شرح Google Play خود برای اعلام هرگونه انتظار درباره کنترلکنندهها به بازیکن استفاده کنید. اگر بازی برای دسته بازی با فرمان بازی مناسبتر است تا دسته بازیای که فقط پد کنترل دارد، این موضوع را بهوضوح بیان کنید. بازیکنی که از کنترلکننده نامناسبی برای بازی استفاده میکند ممکن است تجربه ضعیفی داشته باشد و به بازی شما ردهبندی بدی بدهد.
- از نگاشت دکمه سازگار استفاده کنید: نگاشت دکمه بصری کلید تجربه کاربری خوب است. برای مثال، بااستفاده از دکمه A برای پذیرفتن و دکمه B برای لغو کردن، از رسوم پذیرفتهشده پیروی کنید. همچنین میتوانید با دادن امکان نگاشت مجدد دکمهها به کاربر، انعطافپذیری ارائه دهید. برای اطلاعات بیشتر درباره نگاشت دکمه، به مدیریت کنشهای کنترلکننده مراجعه کنید.
- قابلیتهای کنترلکننده را شناسایی کنید و براساس آن تنظیم کنید: از کنترلکننده درباره قابلیتهایش پرسوجو کنید تا تطابق بین کنترلکننده و بازی را بهینهسازی کنید. برای مثال، ممکن است بخواهید بازیکن با تکان دادن کنترلکننده در هوا، شیئی را هدایت کند، اما اگر کنترلکننده بازیکن فاقد سختافزار شتابسنج و ژیروسکوپ باشد، تکان دادن کنترلکننده کار نمیکند. کنترلکننده را پرسوجو کنید و اگر تشخیص حرکت پشتیبانی نمیشود، به طرح کنترل جایگزین و دردسترس بروید. برای اطلاعات بیشتر درباره پرسمان قابلیتهای کنترلکننده، پشتیبانی از کنترلکنندهها در نسخههای Android را ببینید.
استفاده از دکمههای مناسب
همه کنترلکنندههای بازی دکمههای «شروع»، «جستجو»، یا «منو» را ارائه نمیدهند. مطمئن شوید که رابط کاربری شما به استفاده از این دکمهها وابسته نباشد.
مدیریت چند کنترلکننده
وقتی چند بازیکن درحال انجام بازی هستند و هرکدام کنترلکننده خود را دارند،
مهم است که هر جفت بازیکن-کنترلکننده را نگاشت کنید. برای کسب اطلاعات درباره نحوه
پیادهسازی شناسه شماره کنترلکننده، به getControllerNumber() مراجعه کنید.
مدیریت قطع شدن اتصال کنترلکننده
وقتی اتصال کنترلکننده در وسط بازی قطع میشود، بازی را موقتاً متوقف کنید و کادر گفتگویی نشان دهید که از بازیکن قطعشده میخواهد کنترلکنندهاش را دوباره متصل کند.
همچنین، نکتههای عیبیابی را در کادر گفتگو ارائه دهید. برای مثال، به پخشکننده بگویید «اتصال بلوتوث را بررسی کن.» برای اطلاعات بیشتر درباره پیادهسازی پشتیبانی از دستگاه ورودی، رسیدگی به کنشهای کنترلکننده و نمای کلی بلوتوث را ببینید.
نمایش دستورالعملهای کنترلکننده
اگر بازی شما دستورالعملهای تصویری برای کنترل بازی ارائه میدهد، از تصویر کنترلکنندهای استفاده کنید که نمانامسازی نداشته باشد و فقط شامل دکمههای سازگار با Android باشد.
برای دیدن نمونه تصاویر کنترلکننده سازگار با Android، الگوی دسته بازی Android TV (ZIP) را بارگیری کنید. این کیت شامل یک کنترلکننده سفید روی پسزمینه سیاه و یک کنترلکننده سیاه روی پسزمینه سفید (نشاندادهشده در شکل ۱) بهصورت فایل PNG و فایل Adobe® Illustrator® است.