首页 文章

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

提问于
浏览
0

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

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

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

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

</FrameLayout>

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

enter image description here

根据文档,使用播放控件桥接媒体播放器的推荐方法是通过 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);
}

现在我有自定义的播放行,但 the player no longer responds to button clicks .

我很难弄清楚 PlaybackGlue 实际上是如何对来自 PlaybackGlueHost 的事件作出反应的 . 我知道我可以在行演示器中设置 OnActionClickedListener 并手动处理动作,但它会使胶水/主机交互模型无效 . 它是如何起作用的?没有我能找到的默认播放行...我看到每个 Action 对应一组键码,但我不知道我能做些什么 .

有人能指出我正确的方向吗?关于这个问题的信息很少令人惊讶 .

谢谢 .

1 回答

  • 0

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

相关问题