管理 TV 遙控器

電視裝置需要次要硬體裝置,才能與應用程式互動,例如基本遙控器、指標遙控器或遊戲控制器。為提供一致的使用者體驗,應用程式必須支援方向鍵 (D-pad) 輸入、處理控制器離線,以及支援多種控制器類型的輸入,包括指標遙控器。

D-pad 最小控制項

電視裝置的預設控制器是 D-pad。一般來說,應用程式必須能透過遙控器操作,而遙控器只有上、下、左、右、選取、返回和主畫面按鈕。如果您的應用程式是遊戲,通常需要使用具備額外控制項的遊戲控制器,請嘗試僅支援使用這些 D-pad 控制項進行遊戲。否則,請警告使用者需要控制器,並讓他們使用 D-pad 控制器正常退出遊戲。

如要進一步瞭解如何使用電視裝置的 D-pad 控制器進行操作,請參閱「電視操作」。

處理控制器連線中斷

電視控制器通常是藍牙裝置,可能會定期進入休眠模式並中斷與電視裝置的連線,藉此節省電力。也就是說,如果應用程式未設定處理這些重新連線事件,可能會中斷或重新啟動。這類事件可能在下列任一情況下發生:

  • 播放幾分鐘長的影片時,D-pad 或遊戲控制器可能會進入休眠模式、與電視裝置中斷連線,並在稍後重新連線。
  • 在遊戲過程中,新玩家可能會使用尚未連線的遊戲控制器加入遊戲。
  • 玩家可能會在遊戲過程中離開遊戲,並中斷遊戲控制器連線。

凡是會發生中斷連線和重新連線事件的 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 架構重新啟動,這不是良好的使用者體驗。

處理 D-pad 輸入變化

電視裝置使用者可能會有多種控制器,可與電視搭配使用。舉例來說,使用者可能會有基本的 D-pad 控制器、指標遙控器或遊戲控制器。遊戲控制器用於 D-pad 功能時提供的按鍵代碼,可能與基本 D-pad 傳送的按鍵代碼不同。

請處理 D-pad 輸入的變化,讓使用者不必切換控制器即可操作應用程式。如要進一步瞭解如何處理輸入變化,請參閱「處理方向鍵輸入」。

支援指標遙控器

部分電視裝置支援指標遙控器,例如空中滑鼠或具有觸控式方向鍵 (觸控板) 的遙控器。支援指標遙控器後,使用者就能透過指向並點選、懸停、滑動和拖曳手勢與應用程式互動,在相容硬體上享有更流暢的體驗,同時維持完整的 D-pad 相容性。

在資訊清單中宣告指標遙控器支援

如要指出應用程式可透過指標和觸控輸入進行導覽,請在應用程式資訊清單中,將 <application> 元素 (或個別 <activity> 元素,以便為每個活動設定支援) 內的 android.software.leanback.supports_touch <property> 設為 true:

<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 元素都必須能透過指標遙控器點選,且行為與 D-pad 選取 (KEYCODE_DPAD_CENTER) 一致。
    • Jetpack Compose:使用 Modifier.clickable() 或 pointerInput 修飾符。詳情請參閱「輕觸和按壓」。
    • 檢視畫面:處理檢視畫面上的點擊事件。詳情請參閱「輸入事件總覽」。
  • 視覺懸停狀態:提供清楚的視覺懸停效果,指出指標游標何時位於可選取項目上方。
    • Jetpack Compose:使用 Modifier.hoverable(),或透過 InteractionSource 觀察懸停狀態。詳情請參閱「處理使用者互動」。
    • 檢視畫面:使用狀態清單可繪項目和 android:state_hovered="true" 定義懸停狀態。
  • 滑動和快速滑動捲動:在觸控式中心 D-Pad 按鈕上滑動或快速滑動, 即可觸發水平和垂直捲動,且必須 在所有可捲動的內容中順暢運作。
  • 拖曳捲動:使用者必須能透過拖曳,在可捲動的容器中垂直 (上下) 或水平 (左右) 捲動。
    • Jetpack Compose:標準可捲動容器預設支援指標和觸控捲動。如需自訂實作,請參閱「Compose 中的指標輸入」。
    • 檢視畫面:標準可捲動檢視畫面預設支援觸控捲動。如要瞭解自訂輸入處理,請參閱「觸控與輸入」。
  • 媒體播放拖曳:在媒體播放期間 (例如電視節目和電影),使用者必須能夠與播放進度列 (跳轉滑桿) 互動,方法是指向並點選以跳至過去或未來的時間戳記,以及沿著進度列拖曳 (拖曳) 以跳轉至特定時間。

處理按鈕事件

當使用者點選控制器上的按鈕時,應用程式會收到含有 KeyEvent 的事件。按鈕的預期行為可能是媒體事件 (例如播放、暫停或停止),也可能是電視類型的事件 (例如選取或導覽)。為提供良好的使用者體驗,請為控制器按鈕指派一致的行為。

電視 UI 事件

將電視 UI 行為指派給產生 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 遊戲時,請設計控制配置,以便與標準電視遙控器和專用遊戲控制器搭配使用。

支援 D-pad 控制項

請圍繞 D-pad 控制項規劃控制配置,因為這組控制項是 Android TV 裝置的預設控制項。玩家必須能使用 D-pad 操控遊戲的所有部分,不只是控制核心遊戲玩法,還包括瀏覽選單和廣告。因此,請確保 Android TV 遊戲不會提及觸控介面,例如「輕觸這裡繼續」。

如何塑造玩家與控制器的互動,是提供優質使用者體驗的關鍵。建議你採取下列最佳做法:

  • 事先說明控制器需求:請在 Google Play 說明中向玩家說明對控制器的任何期望。如果遊戲更適合使用有搖桿的遊戲手把,而非只有 D-pad 的遊戲手把,請明確說明。如果玩家使用不適合的控制器玩遊戲,可能會導致體驗不佳,並給予遊戲負評。
  • 使用一致的按鈕對應:直覺的按鈕對應是提供良好使用者體驗的關鍵。舉例來說,請遵循公認的習慣,使用 A 按鈕「接受」,使用 B 按鈕「取消」。您也可以允許使用者重新對應按鈕,提供更多彈性。如要進一步瞭解按鈕對應,請參閱「處理控制器動作」。
  • 偵測控制器功能並據此調整:查詢控制器的功能,盡可能讓控制器與遊戲完美搭配。舉例來說,您可能希望玩家在空中揮動控制器來操控物件,但如果玩家的控制器缺少加速計和陀螺儀硬體,揮動就無法發揮作用。查詢控制器,如果系統不支援動作偵測,請切換至其他可用的控制配置。如要進一步瞭解如何查詢控制器功能,請參閱「支援在各種 Android 版本上執行控制器」。

使用適當的按鈕

並非所有遊戲控制器都提供「開始」、「搜尋」或「選單」按鈕。請確保 UI 不會依賴這些按鈕。

處理多個控制器

當多位玩家玩遊戲時,每位玩家都有自己的控制器,因此請務必對應每位玩家與控制器的組合。如要瞭解如何實作控制器編號識別功能,請參閱 getControllerNumber()。

處理控制器連線中斷

如果控制器在遊戲過程中中斷連線,請暫停遊戲並顯示對話方塊,提示中斷連線的玩家重新連接控制器。

此外,請在對話方塊中提供疑難排解提示。例如,請玩家「檢查藍牙連線」。如要進一步瞭解如何導入輸入裝置支援,請參閱「處理控制器動作」和「藍牙總覽」。

顯示控制器操作說明

如果遊戲提供視覺遊戲控制操作說明,請使用不含品牌宣傳內容的控制器圖片,且僅包含與 Android 相容的按鈕。

如需 Android 相容控制器的範例圖片,請下載 Android TV 遊戲手把範本 (ZIP)。其中包含黑色背景上的白色控制器,以及白色背景上的黑色控制器 (如圖 1 所示),格式為 PNG 檔案和 Adobe® Illustrator® 檔案。

**圖 1.** 使用 Android TV 遊戲手把範本的控制器操作說明範例。