Android Studio V3.12环境下TV开发教程(二)管理电视控制器

时间:2022-04-05 09:39:02

Android Studio V3.12环境下TV开发教程

(转自Android官网https://developer.android.com/training/tv/start)

文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80618879


管理电视控制器

电视设备需要一个辅助硬件设备来与应用程序进行交互,形式为基本的遥控器或游戏控制器。 这意味着您的应用必须支持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输入的变化,所以用户不必物理地切换控制器来操作你的应用程序。 有关处理这些输入变化的更多信息,请参阅处理控制器操作 

处理按钮事件

当用户点击控制器上的按钮时,您的应用会收到一个带有KeyEvent的事件。 该按钮的预期行为可能是媒体事件(如播放,暂停或停止),也可能是电视类型的事件(如选择或导航)。 为了提供良好的用户体验,您的应用应该为控制器按钮分配一致的行为。

电视用户界面事件

生成这些KeyEvent的按钮应该由应用根据下表处理。

KeyEvent的 行为
BUTTON_B,BACK 背部
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTER 选择
DPAD_UP,DPAD_DOWN,DPAD_LEFT,DPAD_RIGHT 导航

媒体活动

当用户正在观看媒体时,生成这些KeyEvent的按钮应按照下表处理。 如果您的应用程序正在控制MediaSession,它应该调用其中一个TransportControls方法,如下所示。 请注意,选择按钮在这种情况下充当播放/暂停按钮。

KeyEvent的 TransportControls调用 行为
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,
KEYCODE_NUMPAD_ENTER
pause()
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() 倒带
(没有KeyEvent与Stop关联) stop() 停止

处理游戏的控制器

支持D-pad控制

由于此控件集是Android TV设备的默认设置,因此围绕方向键盘(D-pad)控件规划控制方案。 玩家需要能够在游戏的各个方面使用D-Pad,而不仅仅是控制核心游戏玩法,还需要导航菜单和广告。 出于这个原因,您还应该确保您的Android TV游戏不涉及触摸界面。 例如,Android TV游戏不应该告诉玩家“ 点击此处继续”。

如何塑造播放器与控制器的交互可能是实现卓越用户体验的关键:

  • 预先沟通控制器要求  使用您的Google Play说明与玩家沟通对控制器的任何期望。 如果一个游戏比一个只有一个D-pad的游戏手柄更适合于游戏手柄,请明确说明这一点。 使用不合适的控制器进行游戏的玩家很可能会有次级体验,并在评分中惩罚您的游戏。
  • 使用一致的按钮映射  直观灵活的按钮映射是获得良好用户体验的关键。 例如,您应该使用A按钮接受 ,并按下B按钮取消 ,以遵守接受的海关。 您还可以提供可重新映射形式的灵活性。 有关按钮映射的更多信息,请参阅处理控制器操作 
  • 检测控制器功能并据此进行调整  向控制器查询其功能以优化控制器和游戏之间的匹配。 例如,您可能希望玩家通过在空中挥动控制器来引导物体。 如果玩家的控制器缺乏加速计和陀螺仪硬件,挥手将无法工作。 所以,你的游戏应该查询控制器,如果不支持运动检测,切换到另一种可用的控制方案。 有关查询控制器功能的更多信息,请参阅Android版本的支持控制器 

提供适当的后退按钮行为

后退按钮不应该充当切换。 例如,不要用它来打开和关闭菜单。 它应该仅通过前一个屏幕(例如:游戏玩法>游戏暂停屏幕>游戏主屏幕> Android主屏幕)向后导航,即面包屑式。

由于后退按钮只应执行线性(向后)导航,因此您可以使用后退按钮离开游戏内菜单(由不同的按钮打开)并返回游戏状态。 有关导航设计的更多信息,请参阅导航  要了解实施情况,请参阅提供适当的后退导航 

使用适当的按钮

并非所有游戏控制器都提供开始,搜索或菜单按钮。 确保你的用户界面不依赖于这些按钮的使用。

处理多个控制器

当多个玩家正在玩一个游戏时,每个玩家都有自己的控制器,因此映射每个玩家 - 控制器对非常重要。 有关如何实现控制器编号标识的信息,请参阅getControllerNumber() 

手柄控制器断开连接

当游戏过程中控制器断开连接时,游戏应该暂停,并且会出现一个对话框,提示断开的玩家重新连接他或她的控制器。

该对话框还应提供故障排除提示(例如,弹出对话框告诉玩家“检查您的蓝牙连接”)。 有关实现输入设备支持的更多信息,请参阅处理控制器操作  有关蓝牙连接的特定信息位于蓝牙 

显示控制器说明

如果您的游戏提供视觉游戏控制指令,则控制器图像应该没有品牌,并且只包含与Android兼容的按钮 

有关Android兼容控制器的示例图像,请下载Android TV游戏板模板(ZIP)  它包括黑色背景上的白色控制器和白色背景上的黑色控制器(如图1所示),作为PNG文件和Adobe®Illustrator®文件。

Android Studio V3.12环境下TV开发教程(二)管理电视控制器

图1.使用Android TV游戏板模板(ZIP)的示例控制器说明。