Android画中画模式的实现⽰例
画中画⽀持
Android 8.0(API 级别 26)允许以画中画模式启动 Activity。画中画是⼀种特殊类型的多窗⼝模式,最常⽤于视频播放。使⽤该模式,⽤户可以通过固定到屏幕⼀⾓的⼩窗⼝观看视频,同时在应⽤之间进⾏导航或浏览主屏幕上的内容。
画中画利⽤ Android 7.0 中的多窗⼝模式 API 来提供固定的视频叠加窗⼝。要将画中画添加到您的应⽤中,您需要注册⽀持画中画的 Activity、根据需要将 Activity 切换为画中画模式,并确保当 Activity 处于画中画模式时,界⾯元素处于隐藏状态且视频能够继续播放。
画中画窗⼝会显⽰在屏幕的最上层,位于系统选择的⼀⾓。您可以将画中画窗⼝拖动到其他位置。当您点按该窗⼝时,会看到两个特殊的控件:全屏切换开关(位于窗⼝的中⼼)和关闭按钮(右上⾓的“X”)。
您的应⽤会控制当前 Activity 在何时进⼊画中画模式。以下是⼀些⽰例:
Activity 可以在⽤户点按主屏幕或最近使⽤的应⽤按钮来选择其他应⽤时,进⼊画中画模式。(这就是 Google 地图在⽤户同时运⾏其他 Activity 时继续显⽰⽅向的⽅式。)
您的应⽤可以在⽤户从某个视频返回以浏览其他内容时,将该视频切换到画中画模式。
您的应⽤可以在⽤户观看到某集内容的结束时将视频切换到画中画模式。主屏幕会显⽰有关这部电视剧下⼀集的宣传信息或剧情摘要信息。
您的应⽤可以提供⼀种⽅式,让⽤户可以在观看视频时将其他内容加⼊播放队列。当主屏幕显⽰内容选择 Activity 时,视频会继续以画中画模式播放。
声明对画中画的⽀持
默认情况下,系统不会⾃动为应⽤提供画中画⽀持。要想在应⽤中⽀持画中画,您可以通过将
android:supportsPictureInPicture 和 android:resizeableActivity 设置为 true,在清单中注册视频 Activity。此外,指定您的Activity 会处理布局配置更改,这样⼀来,在画中画模式转换期间发⽣布局更改时,您的 Activity 不会重新启动。
<activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
将您的 Activity 切换到画中画模式
要进⼊画中画模式,Activity 必须调⽤ enterPictureInPictureMode()。例如,以下代码会在⽤户点击应⽤界⾯中的专⽤按钮时,将 Activity 切换到画中画模式:
@Override
public void onActionClicked(Action action) {
android layout布局if (Id() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPictureMode();
return;
}
...
}
您可能需要添加将 Activity 切换到画中画模式(⽽不是进⼊后台)的逻辑。例如,如果⽤户在 Google 地图正在导航时按下主屏幕或最近使⽤的应⽤按钮,则该应⽤会切换到画中画模式。您可以通过替换 onUserLeaveHint() 来具体了解这种情况:
@Override
public void onUserLeaveHint () {
if (iWantToBeInPipModeNow()) {
enterPictureInPictureMode();
}
}
在画中画期间处理界⾯
当 Activity 进⼊或退出画中画模式时,系统会调⽤ PictureInPictureModeChanged() 或
您应替换这些回调以重新绘制 Activity 的界⾯元素。请注意,在画中画模式下,您的 Activity 会在⼀个⼩窗⼝中显⽰。在画中
画模式下,⽤户可能看不清⼩界⾯元素的详细信息,因此不会与这些界⾯元素互动。界⾯极简的视频播放 Activity 可提供出⾊的⽤户体验。Activity 应仅显⽰视频播放控件。在 Activity 进⼊画中画模式之前移除其他界⾯元素,并在 Activity 再次变为全屏时恢复这些元素:
@Override
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.
...
}
}
添加控件
画中画窗⼝会在⽤户打开窗⼝菜单(通过点按移动设备上的窗⼝或使⽤电视遥控器选择菜单)时显⽰控件。
如果应⽤有⼀个活跃的媒体会话,则窗⼝会显⽰播放、暂停、下⼀个和上⼀个控件。
您还可以通过在进⼊画中画模式之前构建 PictureInPictureParams(使⽤ PictureInPictureParams.Builder.setActions())来明确指定⾃定义操作,并使⽤ enterPictureInPictureMode(android.app.PictureInPictureParams) 或setPictureInPictureParams(android.app.PictureInPictureParams) 在进⼊画中画模式时传递这些参数。请注意,如果您尝试添加的控件数量超过 getMaxNumPictureInPictureActions(),则系统只会添加上限数量的控件。
在画中画模式下继续播放视频
当您的 Activity 切换到画中画模式时,系统会将该 Activity 置于暂停状态并调⽤ Activity 的 onPause() ⽅法。如果该 Activity 在画中画模式下暂停,则视频播放不得暂停,⽽应继续播放。
在 Android 7.0 及更⾼版本中,当系统调⽤ Activity 的 onStop() 时,您应暂停视频播放;当系统调⽤ Activity 的 onStart() 时,您应恢复视频播放。这样⼀来,您就⽆需在 onPause() 中检查应⽤是否处于画中画模式,只需继续播放视频即可。
如果您必须在 onPause() 实现中暂停播放,请通过调⽤ isInPictureInPictureMode() 检查画中画模式并相应地处理播放情况,例如:
@Override
public void onPause() {
// If called while in PIP mode, do not pause playback
if (isInPictureInPictureMode()) {
// Continue playback
...
} else {
// Use existing playback logic for paused Activity behavior.
...
}
}
当您的 Activity 从画中画模式切换回全屏模式时,系统会恢复您的 Activity 并调⽤ onResume() ⽅法。
对单个播放 Activity 使⽤画中画模式
在您的应⽤中,⽤户可能会在主屏幕上浏览内容时选择新的视频,同时还有⼀个视频播放 Activity 正处于画中画模式。应以全屏模式在现有的播放 Activity 中播放新的视频,⽽不是启动可能会令⽤户感到困惑的新 Activity。
要确保将单个 Activity ⽤于视频播放请求并根据需要进⼊或退出画中画模式,请在清单中将 Activity 的 android:launchMode 设置为 singleTask:
<activity android:name="VideoActivity"
...
android:supportsPictureInPicture="true"
android:launchMode="singleTask"
...
在您的 Activity 中,替换 onNewIntent() 并处理新的视频,从⽽根据需要停⽌任何现有的视频播放。
最佳做法
低内存设备可能⽆法使⽤画中画模式。在应⽤使⽤画中画之前,请务必通过调⽤
hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) 进⾏检查以确保可以使⽤画中画。
画中画旨在⽤于播放全屏视频的 Activity。将 Activity 切换到画中画模式时,请避免显⽰视频内容以外的任何内容。跟踪您的Activity 何时进⼊画中画模式及隐藏界⾯元素,如在画中画期间处理界⾯中所述。
由于画中画窗⼝在屏幕的⼀⾓显⽰为浮动窗⼝,因此您应避免在主屏幕中可能被画中画窗⼝遮盖的任何区域内显⽰重要信息。
当 Activity 进⼊画中画模式后,它默认没有获得输⼊焦点。要在画中画模式下接收输⼊事件,请使⽤
MediaSession.setCallback()。如需详细了解如何使⽤ setCallback(),请参阅显⽰“正在播放”卡⽚。
当您的应⽤处于画中画模式时,画中画窗⼝中的视频播放可能会对其他应⽤(例如,⾳乐播放器应⽤或语⾳搜索应⽤)造成⾳频⼲扰。为避免出现此问题,请在开始播放视频时请求⾳频焦点,并处理⾳频焦点更改通知,如管理⾳频焦点中所述。如果您在处于画中画模式时收到⾳频焦点丢失通知,请暂停或停⽌视频播放。
到此这篇关于Android 画中画模式的实现⽰例的⽂章就介绍到这了,更多相关Android 画中画内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论