在 Leanback 应用程序中自定义播放控件

Posted

技术标签:

【中文标题】在 Leanback 应用程序中自定义播放控件【英文标题】:Customizing playback controls in a Leanback app 【发布时间】:2017-10-17 02:35:54 【问题描述】:

我有一个非常基本的任务:使用 Leanback 框架和 Exoplayer 实现 HLS 视频流。

我使用简单的单片段布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <fragment
        android:id="@+id/video_fragment"
        android:name="android.support.v17.leanback.app.VideoFragment"
        android:layout_
        android:layout_ />

</FrameLayout>

显然,VideoFragment 带有一个默认的 HUD,如下所示:

根据文档,将媒体播放器与播放控件桥接的推荐方法是通过PlaybackGlue。例如,Leanback 展示应用程序使用MediaPlayer,因此使用MediaPlayerGlue。出于我的目的,我从 this 项目中获取了 ExoPlayerGlue

private PlaybackFragmentGlueHost glueHost;
private PlaybackControlGlue glue;

@Override
public void onCreate(Bundle savedInstanceState) 
    // ...

    final VideoFragment videoFragment = (VideoFragment) getFragmentManager.findFragmentById(R.id.video_fragment);
    glueHost = new VideoFragmentGlueHost(videoFragment);

    glue = ExoPlayerGlue(this, player)
    glue.setHost(glueHost);

这段代码完成了这项工作:它将点击绑定到播放器事件,因此暂停/恢复和倒带/快进按预期工作。

棘手的部分是自定义播放控件。 PlaybackGlueHost 提供 setPlaybackRow(Row row)setPlaybackRowPresenter(PlaybackRowPresenter presenter) 方法。值得指出的是,这些方法在onCreate() 中无效,所以我要么必须使用处理程序,要么将它们移动到onPostCreate()

@Override
public void onPostCreate(Bundle savedInstanceState) 
    super.onPostCreate(savedInstanceState);

    // Buttons I need in my HUD
    final Action skipPreviousAction = new PlaybackControlsRow.SkipPreviousAction(this); // |<
    final Action rewindAction = PlaybackControlsRow.RewindAction(this); // <<
    final Action playPauseAction = PlaybackControlsRow.PlayPauseAction(this);
    final Action fastForwardAction = PlaybackControlsRow.FastForwardAction(this); // >>
    final Action skipNextAction = PlaybackControlsRow.SkipNextAction(this); // >|
    final Action repeatAction = PlaybackControlsRow.RepeatAction(this);

    final PresenterSelector controlPresenterSelector = ControlButtonPresenterSelector();
    final PlaybackControlsRow playbackControlsRow = PlaybackControlsRow();

    final ArrayObjectAdapter primaryAdapter = ArrayObjectAdapter(controlPresenterSelector);
    final ArrayObjectAdapter secondaryAdapter = ArrayObjectAdapter(controlPresenterSelector);

    // First row
    primaryAdapter.add(skipPreviousAction);
    primaryAdapter.add(rewindAction);
    primaryAdapter.add(playPauseAction);
    primaryAdapter.add(fastForwardAction);
    primaryAdapter.add(skipNextAction);

    // Second row
    secondaryAdapter.add(repeatAction);

    playbackControlsRow.primaryActionsAdapter = primaryAdapter;
    playbackControlsRow.secondaryActionsAdapter = secondaryAdapter;

    // Applying row to glue host
    glueHost.setPlaybackRowPresenter(PlaybackControlsRowPresenter());
    glueHost.setPlaybackRow(playbackControlsRow);

现在我有了自定义播放行,但播放器不再响应按钮点击

我很难弄清楚PlaybackGlue 对来自PlaybackGlueHost 的事件的实际反应。我知道我可以在行演示者中设置OnActionClickedListener 并手动处理操作,但这有点使胶水/主机交互模型无用。它最初是如何运作的?我找不到默认播放行...我看到每个 Action 对应于一组键代码,但我不确定我能做什么。

谁能指出我正确的方向?令人惊讶的是,关于这个主题的信息很少。

谢谢。

【问题讨论】:

您知道如何添加自定义控件,例如 - 报告、添加到播放列表等 【参考方案1】:

原来PlaybackControlGlue 拥有所有必要的方法(setControlsRow()onCreatePrimaryActions()onCreateSecondaryActions()),我在借用的实现中完全错过了这些方法。胶水负责将它们提供给onAttachedToHost() 中的主机,然后设置必要的侦听器。

【讨论】:

以上是关于在 Leanback 应用程序中自定义播放控件的主要内容,如果未能解决你的问题,请参考以下文章

Leanback DetailFragment FullWidthDetailsOverviewRowPresenter 自定义

Leanback 传输控件覆盖是不可见的还是在视频表面后面?

谷歌播放警告缺少leanback意图

Qt 中自定义小部件的自定义样式

如何更改 Android Leanback 库以支持背景视频而不是背景图像

Android 中自定义View的初步总结