Android Studio V3.12环境下TV开发教程
(转自Android官网https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80
首次将用户引入您的应用
要向初次使用者展示如何充分利用您的应用,请在应用启动时提供入职信息。 以下是一些入职信息的例子:
- 提供用户首次访问频道应用时可用频道的详细信息。
- 请注意您的应用中值得注意的功能。
- 说明用户在首次使用应用程序时应该采取的任何必需步骤或推荐步骤。
v17 Leanback支持库提供了OnboardingFragment
类来呈现首次用户信息。 本课介绍如何使用OnboardingFragment
类呈现应用第一次启动时显示的介绍性信息。 OnboardingFragment
使用电视用户界面的最佳做法,以与电视用户界面风格相匹配的方式呈现信息,并且易于在电视设备上导航。
您的OnboardingFragment
不应包含需要用户输入的UI元素,例如按钮和字段。 同样,不应将其用作用户定期执行的任务的UI元素。 如果您需要展示需要用户输入的多页面用户界面,请考虑使用GuidedStepFragment
。
添加一个OnboardingFragment
要将OnboardingFragment
添加到您的应用中,请实施扩展OnboardingFragment
类的类。 通过活动的布局XML或以编程方式将此片段添加到活动中。 确保活动或片段正在使用从Theme_Leanback_Onboarding
派生的主题,如自定义主题中所述 。
在应用程序主要活动的onCreate()
方法中,使用指向OnboardingFragment's
父级活动的Intent
调用startActivity()
。 这可确保您的应用程序启动后立即显示您的OnboardingFragment
。
为确保OnboardingFragment
仅在用户首次启动应用程序时出现,请使用SharedPreferences
对象来跟踪用户是否已经查看了OnboardingFragment
。 定义用户完成查看OnboardingFragment
时更改为true的布尔值。 在主活动的onCreate()
检查此值,并且只有在值为false时才启动OnboardingFragment
父活动。 以下示例显示了检查SharedPreferences
值的onCreate()
重写,如果未设置为true,则会调用startActivity()
以显示OnboardingFragment
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this);
// Check if we need to display our OnboardingFragment
if (!sharedPreferences.getBoolean(
MyOnboardingFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) {
// The user hasn't seen the OnboardingFragment yet, so show it
startActivity(new Intent(this, OnboardingActivity.class));
}
}
在用户查看OnboardingFragment
,将其标记为使用SharedPreferences
对象查看。 为此,请在OnboardingFragment
中覆盖onFinishFragment()
并将SharedPreferences
值设置为true,如下例所示:
@Override
protected void onFinishFragment() {
super.onFinishFragment();
// User has seen OnboardingFragment, so mark our SharedPreferences
// flag as completed so that we don't show our OnboardingFragment
// the next time the user launches the app.
SharedPreferences.Editor sharedPreferencesEditor =
PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
sharedPreferencesEditor.putBoolean(
COMPLETED_ONBOARDING_PREF_NAME, true);
sharedPreferencesEditor.apply();
}
添加OnboardingFragment页面
添加OnboardingFragment
,您需要定义启动页面。 OnboardingFragment
在一系列有序页面中显示内容。 每个页面都可以有一个标题,描述和几个可以包含图像或动画的子视图。
图2显示了一个示例页面,其中标注了可标记OnboardingFragment
可以提供的可自定义页面元素的标注。 页面元素是:
- 页面标题。
- 页面描述。
- 页面内容视图,在这种情况下,在灰色框中显示一个简单的绿色复选标记。 该视图是可选的。 使用此视图来说明页面详细信息,如突出显示页面描述的应用程序功能的屏幕截图。
- 页面背景视图,在这种情况下是一个简单的蓝色渐变。 此视图始终呈现在页面上的其他视图之后。 该视图是可选的。
- 页面前景视图,在这种情况下是一个标志。 此视图始终呈现在页面上的所有其他视图前面。 该视图是可选的。
当您的OnboardingFragment
首次创建或附加到父级活动时,初始化页面信息,因为系统在创建片段视图时请求页面信息。 您可以在您的类构造函数或onAttach()
的重写中初始化页面信息。
覆盖为系统提供页面信息的以下每种方法:
getPageCount()
返回OnboardingFragment
的页数。getPageTitle()
返回所请求页码的标题。getPagedescription()
返回所请求页码的描述。
覆盖以下每种方法以提供用于显示图像或动画的可选子视图:
onCreateBackgroundView()
返回一个您创建用作背景视图的视图,如果不需要背景视图,则返回null。onCreateContentView()
返回一个您创建用作内容视图的视图,如果不需要内容视图,则返回null。onCreateForegroundView()
返回一个您创建的View
作为前景视图,如果不需要前景视图,则返回null。
系统将您创建的View
添加到页面布局。 以下示例覆盖onCreateContentView()
并返回一个ImageView
:
private ImageView mContentView;
...
@Override
protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) {
mContentView = new ImageView(getContext());
mContentView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
mContentView.setImageResource(R.drawable.onboarding_content_view);
mContentView.setPadding(0, 32, 0, 32);
return mContentView;
}
添加初始徽标屏幕
您的OnboardingFragment
可以从介绍您的应用的可选徽标屏幕开始。 如果您想要在您的OnboardingFragment's
onCreate()
方法中显示Drawable
作为您的徽标屏幕,请使用Drawable
的ID调用setLogoResourceId()
。 系统将淡入并短暂显示此Drawable
,然后在显示OnboardingFragment
的第一页之前淡出Drawable
。
如果要为徽标屏幕提供自定义动画,而不是调用setLogoResourceId()
,请覆盖onCreateLogoAnimation()
并返回呈现您的自定义动画的Animator
对象,如下例所示:
@Override
public Animator onCreateLogoAnimation() {
return AnimatorInflater.loadAnimator(mContext,
R.animator.onboarding_logo_screen_animation);
}
自定义页面动画
系统在显示OnboardingFragment
的第一页时以及用户导航到其他页面时使用默认动画。 您可以通过覆盖OnboardingFragment
方法来自定义这些动画。
要自定义出现在首页上的动画,请重写onCreateEnterAnimation()
并返回一个Animator
。 以下示例创建一个可以水平缩放内容视图的Animator
:
@Override
protected Animator onCreateEnterAnimation() {
Animator startAnimator = ObjectAnimator.ofFloat(mContentView,
View.SCALE_X, 0.2f, 1.0f).setDuration(ANIMATION_DURATION);
return startAnimator;
}
要自定义用户导航到其他页面时使用的动画,请覆盖onPageChanged()
。 在你的onPageChanged()
方法中,创建Animators
,删除前一页并显示下一页,将这些添加到AnimatorSet
并播放该集。 以下示例使用淡出动画删除上一页,更新内容视图图像,并使用淡入淡出动画显示下一页:
@Override
protected void onPageChanged(final int newPage, int previousPage) {
// Create a fade-out animation used to fade out previousPage and, once
// done, swaps the contentView image with the next page's image.
Animator fadeOut = ObjectAnimator.ofFloat(mContentView,
View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION);
fadeOut.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mContentView.setImageResource(pageImages[newPage]);
}
});
// Create a fade-in animation used to fade in nextPage
Animator fadeIn = ObjectAnimator.ofFloat(mContentView,
View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
// Create AnimatorSet with our fade-out and fade-in animators, and start it
AnimatorSet set = new AnimatorSet();
set.playSequentially(fadeOut, fadeIn);
set.start();
}
有关如何创建Animators
和AnimatorSets
更多详细信息,请参阅属性动画 。
自定义主题
任何OnboardingFragment
实现都必须使用Theme_Leanback_Onboarding
主题或从Theme_Leanback_Onboarding
继承的主题。 通过执行以下操作之一来设置OnboardingFragment
的主题:
- 将
OnboardingFragment's
父级活动设置为使用所需的主题。 以下示例显示如何设置活动以在应用程序清单中使用Theme_Leanback_Onboarding
:<activity
android:name=".OnboardingActivity"
android:enabled="true"
android:exported="true"
android:theme="@style/Theme.Leanback.Onboarding">
</activity> - 通过在自定义活动主题中使用
LeanbackOnboardingTheme_onboardingTheme
属性来设置父活动中的主题。 将此属性指向只有活动中的OnboardingFragment
对象使用的另一个自定义主题。 如果您的活动已使用自定义主题并且您不想将OnboardingFragment
样式应用于活动中的其他视图,请使用此方法。 - 覆盖
onProvideTheme()
并返回所需的主题。 如果多个活动使用您的OnboardingFragment
或者父活动无法使用所需的主题,请使用此方法。 以下示例覆盖onProvideTheme()
并返回Theme_Leanback_Onboarding
:@Override
public int onProvideTheme() {
return R.style.Theme_Leanback_Onboarding;
}
启用后台播放
观看电视设备上的内容的用户可能随时决定切换到电视启动器。 如果用户在使用电视回放应用时切换到启动器,则默认情况下应用已暂停。 由于用户没有明确请求暂停播放,因此默认行为可能看起来突然且意外。 本课介绍如何在您的应用中启用后台播放功能,从而提供更好的用户体验。
requestVisibleBehind()
方法在API级别26中已被弃用。
它将在未来的版本中删除。 Android版本8.0及更高版本不支持此页面上描述的功能。
请求后台播放
通常,当用户点击Home显示电视启动器时,活动暂停。 但是,您的应用可以请求后台播放,其中活动将继续在电视启动器后播放。
要请求后台播放,请调用requestVisibleBehind()
。 如果活动停止可见,请务必清理媒体资源。 例如,如果requestVisibleBehind()
返回false
以指示请求失败,或者系统调用了onVisibleBehindCanceled()
重写,则应该释放媒体资源。
@Override
public void onPause() {
super.onPause();
if (mVideoView.isPlaying()) {
// Argument equals true to notify the system that the activity
// wishes to be visible behind other translucent activities
if (! requestVisibleBehind(true)) {
// App-specific method to stop playback and release resources
// because call to requestVisibleBehind(true) failed
stopPlayback();
}
} else {
// Argument equals false because the activity is not playing
requestVisibleBehind(false);
}
}
@Override
public void onVisibleBehindCanceled() {
// App-specific method to stop playback and release resources
stopPlayback();
super.onVisibleBehindCanceled();
}