Leanback UI 工具包中的布局

使用 Compose 更好地构建
使用 Jetpack Compose for Android TV OS,以最少的代码创建美观的界面。

电视屏幕通常从约 10 英尺(约 3 米)的距离观看,虽然它比大多数其他 Android 设备显示屏大得多,但电视屏幕提供的细节和色彩水平不如小型设备屏幕。这些因素要求您在设计应用布局时考虑 TV 设备,以创建有用且愉悦的用户体验。

使用 TV 布局主题

Android 主题可以为您的 TV 应用布局提供基础。使用主题来修改旨在 TV 设备上运行的应用 activity 的显示。本节解释了要使用哪些主题。

Leanback 主题

androidx.leanback 库包含 Theme.Leanback,这是一个为 TV activity 提供一致视觉风格的主题。对于使用 AndroidX Leanback 类构建的任何 TV 应用,请使用此主题。以下代码示例展示了如何将此主题应用于 activity

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:theme="@style/Theme.Leanback">

NoTitleBar 主题

标题栏是 Android 手机和平板电脑应用的标准用户界面元素,但它不适用于 TV 应用。如果您不使用 AndroidX Leanback 类,请将 NoTitleBar 主题应用于您的 TV activity,以禁止显示标题栏。以下是来自 TV 应用 manifest 的代码示例,演示了如何应用此主题来移除标题栏的显示

<application>
  ...
  <activity
    android:name="com.example.android.TvActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar">
    ...
  </activity>
</application>

AppCompat 主题

在 Android 移动应用中,通常将 AppCompatActivityTheme.AppCompat 主题之一结合使用。这种组合允许您使用可绘制 tinting 等功能,而无需担心设备上运行的 Android 版本。如果您正在开发的应用程序仅在 Android TV 上运行,请勿使用 AppCompatActivity,因为它启用的功能要么已在 Android TV 上可用,要么不相关。

如果您正在构建一个在 Android 移动设备和 Android TV 之间共享代码库的应用,您可能会因为主题设置而遇到一些挑战。AppCompatActivity 和各种 AppCompat 微件要求您使用 Theme.AppCompat,而 Leanback UI 工具包 fragment 则期望您使用 FragmentActivityTheme.Leanback

如果您需要在 Android 移动设备和 Android TV 上使用相同的基本 activity,或者您想使用基于 AppCompat 微件(如 AppCompatImageView)的自定义视图,请使用 Theme.AppCompat.Leanback 主题。这些主题提供了所有来自 AppCompat 的主题设置,并提供了 Leanback 特定的值。

您可以像自定义任何其他主题一样自定义 Theme.AppCompat.Leanback 主题。例如,如果您想更改 Leanback UI 工具包的 OnboardingSupportFragment 特定的值,请执行类似以下操作

<style name="MyOnboarding" parent="Theme.AppCompat.Leanback.Onboarding">
    <item name="onboardingLogoStyle">@style/MyOnboardingLogoStyle</item>
    <item name="onboardingPageIndicatorStyle">@style/MyOnboardingPageIndicatorStyle</item>
</style>

构建基本的 TV 布局

TV 设备的布局必须遵循一些基本准则,以确保它们在大屏幕上可用且有效。请遵循以下提示来构建针对 TV 屏幕优化的布局

  • 构建横向布局。TV 屏幕始终以横向模式显示。
  • 将屏幕导航控件放在屏幕的左侧或右侧,并将垂直空间留给内容。
  • 使用 fragment 将界面划分为多个部分。使用 GridView 等视图组,而不是 ListView,以更好地利用横向屏幕空间。
  • 使用 RelativeLayoutLinearLayout 等视图组来排列视图。这种方法允许系统根据 TV 屏幕的大小、对齐方式、纵横比和像素密度调整视图的位置。
  • 在布局控件之间添加足够的边距,以避免界面杂乱。

过扫描

由于电视标准的发展旨在向观众呈现全屏画面,TV 布局有一些独特的要求。因此,TV 设备可能会剪切应用布局的外部边缘,以确保整个显示屏都被填充。这种行为通常被称为过扫描

将必须始终对用户可见的屏幕元素放置在过扫描安全区域内。在布局的左右边缘添加 48 dp 的 5% 边距,在顶部和底部边缘添加 27 dp 的边距,有助于确保布局中的屏幕元素位于过扫描安全区域内。

不要调整用户不直接交互的背景屏幕元素,也不要将这些元素剪切到过扫描安全区域。这种方法有助于确保背景屏幕元素在所有屏幕上都正确显示。

以下示例显示了一个根布局,它可以包含背景元素,以及一个具有 5% 边距并可以包含过扫描安全区域内元素的嵌套子布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <!-- Screen elements that can render outside the overscan-safe area go here. -->

   <!-- Nested RelativeLayout with overscan-safe margin. -->
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_marginTop="27dp"
       android:layout_marginBottom="27dp"
       android:layout_marginLeft="48dp"
       android:layout_marginRight="48dp">

      <!-- Screen elements that need to be within the overscan-safe area go here. -->

   </RelativeLayout>

</RelativeLayout>

注意:如果您使用 AndroidX Leanback 类(例如 BrowseSupportFragment 或相关微件),请勿将过扫描边距应用于您的布局,因为这些布局已包含过扫描安全边距。

构建可用的文本和控件

遵循以下提示,让您的 TV 应用中的文本和控件更容易从远处看清

  • 将文本分解成小块,以便用户快速浏览。
  • 在深色背景上使用浅色文本。这种样式在电视上更容易阅读。
  • 避免使用轻量级字体或笔画极窄和极宽的字体。使用简单的无衬线字体和抗锯齿来提高可读性。
  • 使用 Android 的标准字体大小
    <TextView
          android:id="@+id/atext"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:singleLine="true"
          android:textAppearance="?android:attr/textAppearanceMedium"/>
  • 确保所有视图微件足够大,以便坐在屏幕 10 英尺(约 3 米)外的用户能够清晰看到。最佳方法是使用布局相对大小而非绝对大小,以及密度无关像素 (dp) 单位而非绝对像素单位。例如,要设置微件的宽度,请使用 wrap_content 而非像素测量值;要设置微件的边距,请使用 dp 值而非 px 值。

有关密度无关像素和构建布局以处理更大屏幕尺寸的更多信息,请参阅屏幕兼容性概览

管理 TV 布局资源

与其他所有 Android 设备一样,电视具有不同的屏幕尺寸并支持不同的分辨率,包括但不限于 720p、1080p 和 4K。确保您的应用支持不同的屏幕尺寸

不同的屏幕尺寸和分辨率具有不同的像素密度。为了在不同屏幕尺寸、分辨率和像素密度下保持界面的外观,请使用密度无关像素 (dp) 而非像素来定义界面测量值。不同 TV 面板分辨率的屏幕像素密度如下所述。

面板分辨率 屏幕像素密度
720p tvdpi
1080 xhdpi
4K xxxhdpi
如需了解更多信息,请参阅支持不同像素密度

有关优化大屏幕布局和资源的更多信息,请参阅屏幕兼容性概览

应避免的布局模式

有一些布局构建方法在 TV 设备上效果不佳。以下是开发 TV 布局时应避免的一些用户界面方法。

  • 重复使用手机或平板电脑布局:请勿不加修改地重复使用手机或平板电脑应用的布局。为其他 Android 设备外形因素构建的布局不适用于 TV 设备,并且必须针对在 TV 上的操作进行简化。
  • 使用 ActionBar虽然操作栏建议在手机和平板电脑上使用,但它们不适用于 TV 界面。强烈不建议在 TV 应用中使用操作栏选项菜单或任何下拉菜单,因为使用遥控器导航此类菜单非常困难。
  • 使用 ViewPager在手机或平板电脑上屏幕之间滑动效果很好,但在电视上不要尝试这样做!

有关设计适用于 TV 的布局的更多信息,请参阅TV 设计指南。

处理大型位图

TV 设备与其他 Android 设备一样,内存有限。如果您的应用布局使用非常高分辨率的图像,或者在应用运行中使用大量高分辨率图像,它可能很快就会达到内存限制并导致内存不足错误。在大多数情况下,我们建议使用 Glide 库来获取、解码和显示应用中的位图。有关处理位图时获得最佳性能的更多信息,请参阅我们通用的Android 图形最佳实践

提供有效广告

对于客厅环境,我们建议您使用全屏且可在 30 秒内关闭的视频广告解决方案。Android TV 上的广告功能(例如关闭按钮和点击跳转)必须使用方向键(D-pad)而不是触摸来访问。

Android TV 不提供网络浏览器。您的广告不得尝试启动网络浏览器或重定向到未获 Android TV 设备批准的 Google Play 商店内容。

注意:您可以将 WebView 类用于社交媒体服务的登录。

其他资源

为 TV 进行设计