大家好,欢迎来到IT知识分享网。
Android Studio TV开发教程
(转自Android官网https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80620433
使用Leanback运输控制
Leanback库具有新的播放控件,可提供改进的用户体验。 对于视频应用程序,传输控件使用向前/向后控件支持视频清理。 清理显示屏时会显示缩略图,以帮助浏览视频。
该库包含抽象类以及为开发人员提供更精细控制的开箱即用实现。 使用预构建的实现,您可以快速构建功能丰富的应用程序,而无需太多编码。 如果您需要更多定制,您可以扩展任何库的预构建组件。
控件和播放器
leanback库将用户界面与回放视频的播放器中的传输控件分开。 这是通过两个组件完成的:一个用于显示传输控件(可选视频)的播放片段和一个用于封装媒体播放器的播放器适配器 。
播放片段
您应用的UI活动应使用PlaybackFragment
或VideoFragment
。 两者都包含leanback运输控制:
PlaybackFragment
根据需要动画其传输控件以隐藏/显示它们。VideoFragment
扩展了PlaybackFragment
并具有SurfaceView
来渲染视频。
您可以自定义片段的ObjectAdapter
来增强UI。 例如,使用setAdapter()
添加“相关视频”行。
PlayerAdapter
PlayerAdapter
是一个控制底层媒体播放器的抽象类。 开发人员可以选择预先构建的MediaPlayerAdapter
实现,或者编写他们自己的这个类的实现。
胶合在一起的碎片
您必须使用一些“控制胶水”将播放片段连接到播放器。 leanback库提供两种胶水:
PlaybackBannerControlGlue
以“旧样式”绘制播放片段中的传输控件,将它们放置在不透明的背景中。 (PlaybackBannerControlGlue
取代了已弃用的PlaybackControlGlue
。)PlaybackTransportControlGlue
使用具有透明背景的“新样式”控件。
如果您希望您的应用支持视频清理,则必须使用PlaybackTransportControlGlue
。
您还需要指定一个将胶水绑定到回放片段的“胶水主机”,在UI中绘制传输控件并保持它们的状态,并将传输控制事件传递回胶水。 主机必须匹配回放片段类型。 将PlaybackFragmentGlueHost
与PlaybackFragmentGlueHost
一起使用,并将VideoFragmentGlueHost
与VideoFragmentGlueHost
一起使用。
下面是一个插图,展示了Leanback运输控制系统的各个部分如何配合在一起:
将您的应用粘合在一起的代码应该位于定义UI的PlaybackFragment或VideoFragment中。
在以下示例中,该应用程序构造PlaybackTransportControlGlue
的实例,将其命名为playerGlue
,并将其VideoFragment
连接到新创建的MediaPlayerAdapter
。 由于这是一个VideoFragment
,安装程序代码调用setHost()
将VideoFragmentGlueHost
附加到playerGlue
。 该代码包含在扩展VideoFragment
的类中。
public class MyVideoFragment extends VideoFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final PlaybackTransportControlGlue<MediaPlayerAdapter> playerGlue = new PlaybackTransportControlGlue(getActivity(), new MediaPlayerAdapter(getActivity())); playerGlue.setHost(new VideoFragmentGlueHost(this)); playerGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() { @Override public void onPreparedStateChanged(PlaybackGlue glue) { if (glue.isPrepared()) { playerGlue.setSeekProvider(new MySeekProvider()); playerGlue.play(); } } }); playerGlue.setSubtitle("Leanback artist"); playerGlue.setTitle("Leanback team at work"); String uriPath = "android.resource://com.example.android.leanback/raw/video"; playerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath)); } }
请注意,设置代码还定义了一个PlayerAdapter.Callback
来处理来自媒体播放器的事件。
自定义UI胶水
您可以自定义PlaybackBannerControlGlue
和PlaybackTrabsportControlGlue
。 改变PlaybackControlsRow
。
自定义标题和说明
要自定义播放控件顶部的标题和说明,请覆盖onCreateRowPresenter()
:
@Override protected PlaybackRowPresenter onCreateRowPresenter() { PlaybackTransportRowPresenter presenter = (PlaybackTransportRowPresenter) super.onCreateRowPresenter(); presenter.setDescriptionPresenter(new MyCustomDescriptionPresenter()); return presenter; }
添加控件
控件胶水会显示PlaybackControlsRow
操作的控件。
PlaybackControlsRow
中的操作分配给两组: 主要操作和辅助操作 。 主要组的控件出现在搜索栏上方,而次要组的控件出现在搜索栏下方。 最初,播放/暂停按钮只有一个主要操作,并且没有次要操作。
您可以通过覆盖onCreatePrimaryActions()
和onCreateSecondaryActions()
来添加主要和次要组的操作。
private PlaybackControlsRow.RepeatAction mRepeatAction; private PlaybackControlsRow.PictureInPictureAction mPipAction; private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction; private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction; private PlaybackControlsRow.SkipPreviousAction mSkipPreviousAction; private PlaybackControlsRow.SkipNextAction mSkipNextAction; private PlaybackControlsRow.FastForwardAction mFastForwardAction; private PlaybackControlsRow.RewindAction mRewindAction; @Override protected void onCreatePrimaryActions(ArrayObjectAdapter primaryActionsAdapter) { // Order matters, super.onCreatePrimaryActions() will create the play / pause action. // Will display as follows: // play/pause, previous, rewind, fast forward, next // > /|| |< << >> >| super.onCreatePrimaryActions(primaryActionsAdapter); primaryActionsAdapter.add(mSkipPreviousAction); primaryActionsAdapter.add(mRewindAction); primaryActionsAdapter.add(mFastForwardAction); primaryActionsAdapter.add(mSkipNextAction); } @Override protected void onCreateSecondaryActions(ArrayObjectAdapter adapter) { super.onCreateSecondaryActions(adapter); adapter.add(mThumbsDownAction); adapter.add(mThumbsUpAction); }
您必须重写onActionClicked()
来处理新的操作。
@Override public void onActionClicked(Action action) { if (action == mRewindAction) { // Handle Rewind } else if (action == mFastForwardAction ) { // Handle FastForward } else if (action == mThumbsDownAction) { // Handle ThumbsDown } else if (action == mThumbsUpAction) { // Handle ThumbsUp } else { // The superclass handles play/pause and delegates next/previous actions to abstract methods, // so those two methods should be overridden rather than handling the actions here. super.onActionClicked(action); } } @Override public void next() { // Skip to next item in playlist. } @Override public void previous() { // Skip to previous item in playlist. }
在特殊情况下,您可能需要实现自己的PlaybackTransportRowPresenter
来呈现自定义控件,并使用PlaybackSeekUi
响应查找操作。
视频擦洗
如果您的应用使用VideoFragment
并且您想支持视频清理。
您需要提供PlaybackSeekDataProvider
的实现。 此组件提供滚动时使用的视频缩略图。 您必须通过扩展PlaybackSeekDataProvider
来实现自己的提供者。 请参阅leanback-showcase应用程序中的示例。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22203.html