画中画模式
实现
可以通过
hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
判断系统是否支持画中画模式
系统默认情况下不会为应用提供画中画支持。通过在
Manifest.xml
文件中为activity标签添加
android:supportsPictureInPicture
和
android:resizeableActivity
为
true
来实现。建议指定Activity布局配置,以防在布局发生变化时触发Activity重启
如:
<manifest
... >
<application
...>
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation">
<intent-filter>
...
</intent-filter>
</application>
</manifest>
注册后,即可在Activity中调用
enterPictureInPictureMode(PictureInPictureParams params)
来进入画中画模式
void pipMode(){
PictureInPicture params = new PictureInPictureParams.Builder()
.setAspectRatio(new Rational(3, 4) //横宽比3:4
.build()
enterPictureInPictureMode(params);
}
fun pipMode(){
val params = PictureInPictureParams.Builder
.aspectRatio(Rational(3, 4)) //横宽比3:4
enterPictureInPictureMode(params)
}
在一些情况下,我们需要检测用户使用最近应用按钮或者主屏幕按钮时自动进入画中画模式。我们可以通过重写
onUserLeaveHint()
来实现监听
@Override
public void onUserLeaveHint(){
if (isPipWhenExit) //若确定需要进入画中画模式
pipMode();
}
override fun onUserLeaveHint(){
if (isPipWhenExit) //若确定需要进入画中画模式
pipMode()
}
监听状态
可以通过
Activity#isInPictureInPictureMode()
判断当前是否在画中画模式
画中画模式是多窗口模式的特例。如果
Activity.isInPictureInPictureMode()
返回 true,则
Activity.isInMultiWindowMode()
也返回 true。
当进入或退出画中画模式时,系统进入
Activity#onPictureInPictureModeChanged(boolean isInPictureInPictureMode)
或
Fragment#onPictureInPictureModeChanged(boolean isInPictureInPictureMode)
应注意,在画中画模式下,由于画面在一个小窗口中展示,用户可能看不清细节信息,所以不会与界面元素交互。建议在进入画中画模式后将界面转入极简模式,移除多余界面元素,并在恢复全屏时恢复这些元素
交互
画中画模式中,用户不能直接与界面进行交互。如果应用有一个活跃的媒体绘画,窗口会在点击时显示播放、暂停、下一个和上一个等控件。
当让也可以在创建
PictureInPictureParams
时使用
PictureInPictureParams#Builder#setActions(List<RemoteAction> actions)
来添加按钮。若添加的按钮控件数量超过
getMaxNumPictureInPictureActions()
,系统只会添加上限数量的按钮
应注意,当进入画中画模式时,系统会调用
Activity#onPause()
方法,因此当使用画中画模式时,应注意是否错误的回收了部分内容