Android Studio V3.12环境下TV开发教程(十一)首次将用户引入您的应用

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使用电视用户界面的最佳做法,以与电视用户界面风格相匹配的方式呈现信息,并且易于在电视设备上导航。

图1.一个示例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页面元素。

图2显示了一个示例页面,其中标注了可标记OnboardingFragment可以提供的可自定义页面元素的标注。 页面元素是:

  1. 页面标题。
  2. 页面描述。
  3. 页面内容视图,在这种情况下,在灰色框中显示一个简单的绿色复选标记。 该视图是可选的。 使用此视图来说明页面详细信息,如突出显示页面描述的应用程序功能的屏幕截图。
  4. 页面背景视图,在这种情况下是一个简单的蓝色渐变。 此视图始终呈现在页面上的其他视图之后。 该视图是可选的。
  5. 页面前景视图,在这种情况下是一个标志。 此视图始终呈现在页面上的所有其他视图前面。 该视图是可选的。

当您的OnboardingFragment首次创建或附加到父级活动时,初始化页面信息,因为系统在创建片段视图时请求页面信息。 您可以在您的类构造函数或onAttach()的重写中初始化页面信息。

覆盖为系统提供页面信息的以下每种方法:

覆盖以下每种方法以提供用于显示图像或动画的可选子视图:

系统将您创建的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'sonCreate()方法中显示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();
}

有关如何创建AnimatorsAnimatorSets更多详细信息,请参阅属性动画 

自定义主题

任何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();
}


猜你喜欢

转载自blog.csdn.net/jiawuhan/article/details/80647450