创造 “魔术时刻” —— Android 8.0 画中画
https://v.qq.com/txp/iframe/player.html?vid=r0505ui7vo5&width=500&height=375&auto=0
画中画(PIP)是一个有趣的功能,给用户一个神奇的体验。PIP 是一种特殊的多窗口 UI 布局,一般来说视频和相机能通过 PIP 获得更好的体验。例如,在观看 YouTube 时,您可以选择另一个视频添加到播放列表,同时继续观看当前视频,因为正在运行的视频进入 PIP 模式。这是一个神奇的时刻,让您舒服地同时做两件事情。
△ 切换 PIP 检查您的日历
PIP 的另一个很好的用途是在您进行视频聊天时检查您的日历。视频可以缩小,并允许您检查日历中的约会。完成另一项任务时,您可以继续进行对话。
在您的应用程序中使用 PIP
从 Android 8.0(API 级别 26)开始,您可以轻松地将您的活动置于 PIP 模式。
您的活动必须声明它支持 PIP。在您的清单中,您应该设置 supportsPictureInPicture 标志 true。
android:name=".MediaSessionPlaybackActivity"
...
android:supportsPictureInPicture="true" />
有意进入 PIP
有几个适当的时间进入 PIP 模式。最简单的方法是使用按钮或菜单项。材料设计提供标准 PIP 图标 ; 然而,一个菜单选项可能对您的应用程序更有意义。
△ 画中画 图标
△ 画中画 图标(备选)
该图标应该指示进入 PIP 会发生什么。例如,如果您的 PIP 窗口显示在屏幕的右上方,请使用图标为用户提供预期的展示。
PIP 作为切换应用程序的替代方案
进入 PIP 而不是离开应用程序通常很有用,例如当用户按住 home 或者 back 按钮时。
PIP 可以作为 “切换应用” 的更佳解决方案
当用户选择返回,进入 PIP 模式可能比关闭正在运行的视频更好。例如,用户可能正在浏览更多内容,并且可以继续以 PIP 模式观看原始节目。如果您以这种方式进入 PIP 模式,请确保提供一个选项来关闭 PIP 窗口。
如果用户按 Home 键,或者打开最近的应用程序,或者在处理视频通话或观看视频时打开通知,进入 PIP 而不是离开应用程序可能更有意义。
Android Activity 生命周期有一个回调,您可以通过重载 onUserLeaveHint ( ) 来得知用户何时离开了应用程序。
深入了解
当您处于 PIP 模式时,您应该隐藏最重要的内容(一般是视频或者相机)之外的所有内容。
在进入 PIP 之前,您应该通过执行以下任务进行准备:
隐藏视图上的任何控件或覆盖。例如,隐藏视频播放控件或相机选项菜单。
创建一个 PictureInPictureParams.Builder
根据控件的放置状态设置宽高比。例如,Google 地图导航具有垂直的 PIP 窗口,而 YouTube 视频会在水平窗口中显示。
(可选)添加自定义操作。例如,为视频播放提供倒带/快进,或为视频通话提供静音操作。
设置一个 Rect 边界以平滑活动到 PIP 的转换。
以下是一个响应一个按钮进入 PIP 模式的例子:
if (mMovieView == null) {
return;
}
// Hide the controls in picture-in-picture mode.
mMovieView.hideControls();
// Calculate the aspect ratio of the PIP screen.
Rational aspectRatio = new Rational(
mMovieView.getWidth(), mMovieView.getHeight());
PictureInPictureParams params = mPictureInPictureParamasBuilder
.setAspectRatio(aspectRatio)
.build();
enterPictureInPictureMode(params);
}
下面是一个 onUserLeaveHint ( ) 来抓住应用程序切换并进入 PIP 作为辅助作用的例子,不需要用户操作。
...
protected void onUserLeaveHint() {
super.onUserLeaveHint();
PictureInPictureParams params =
new PictureInPictureParams.Builder()
// Set actions or aspect ratio.
.build();
enterPictureInPictureMode(params);
}
...
}
您应该创建一个 PictureInPictureParams 传递给 enterPictureInPictureMode ( ) 。有一个重载的方法,不推荐使用没有参数的。Android Studio 可以帮助您确保不使用已弃用的 API。
切换画中画模式
进入 PIP 模式很简单,但如果用户要将窗口还原到全屏呢?您应该将活动恢复到进入 PIP 之前的活动。例如,显示您隐藏的播放控制。活动有一个回调,onPictureInPictureModeChanged ( ) ,您可以通过重载来监听这些事件。
如果用户将窗口恢复为全屏,isInPictureInPictureMode 将会是 false。这时您需要将视图恢复到进入 PIP 模式之前的状态。例如,显示视频播放控件或恢复相机的选项菜单。
public void onPictureInPictureModeChanged (
boolean isInPictureInPictureMode, Configuration newConfig) {
if (isInPictureInPictureMode) {
//Hide the full-screen UI (controls, etc.) while in
// picture-in-picture mode.
...
} else {
// Restore the full-screen UI.
...
}
}
请注意,您可以获得对新配置的引用,就像配置本身发生变化一样。
添加自定义操作
即使您应该在 PIP 模式下简化 UI,您仍然可以允许用户与远程操作进行交互。
PictureInPictureParams.Builder 有 setActions ( ) 方法,这个方法获取一个 RemoteActions 列表。如果列表多于 getMaxNumPictureInPictureActions ( ) ,输入列表将被截断为该数字。
您可以添加自定义的简单操作,保留一些全屏功能,如播放/暂停切换。示例应用程序定义了两个自定义操作 ; 播放 / 暂停的切换和请求信息。
△ 自定义 PIP 操作
如果您正在使用 MediaSession 进行视频播放,则框架会自动识别会话,并添加要播放/暂停的动作,切换上一个下一个。这些操作由 MediaSession.Callback 中的相应方法处理。
△ MediaSession 的默认操作
根据 MediaSession 状态,界面会自动启用和禁用。在下图中,MediaSession 状态设置为 PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_SKIP_TO_NEXT
△ 基于 MediaSession 状态的操作更新
如果您不需要 MediaSession 提供的任何或所有操作,请调用 setActions ( ) 以仅指定所需的操作。
综上所述
决定何时进入 PIP 是最难的部分。如果体验的完成度足够高,您的应用会让用户觉得智能和贴心,但如果完成度低,则可能让用户感受到笨拙的动作。所以请认真琢磨用户在操作时的需求,并确保您的代码能落实到位,从而提供智能和贴心的体验。
进入 PIP 模式的最常见流程如下:
从按钮触发
onClicked (View),onOptionsItemSelected (MenuItem) 等等。
有意的离开您的应用程序触发
onUserLeaveHint ( )
从返回触发
onBackPressed ( )
以上就是制造画中画魔术时刻的全部内容了,如果您对 Android Oreo 有任何建议或者问题,欢迎您在留言板里提出,分享给我们 ~
推荐阅读:
正式发布 Android 架构组件 1.0 稳定版 | 附带中文介绍视频
Android 8.1 开发者预览版 —— 为 ML 机器学习做好准备的 Oreo 升级版