gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:35:00 24 4
gpt4 key购买 nike

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

我使用一个简单的单 fragment 布局:

<?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);
}

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

棘手的部分是自定义播放控件。 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 的事件使用react的。我知道我可以在行演示器中设置 OnActionClickedListener 并手动处理操作,但这有点使胶水/主机交互模型变得无用。它最初是如何运作的?我找不到默认的播放行...我看到每个 Action 都对应一组键码,但我不确定我能从中得到什么。

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

谢谢。

最佳答案

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

关于android - 在 Leanback 应用程序中自定义播放控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com