Android8.0开始支持Activity进入画中画模式。画中画是一种特殊类型的多窗口模式。它允许用户在固定在屏幕一角的小窗口观看视频的同时在应用之间切换或浏览主屏幕上的内容。
让App进入画中画,需要将Activity设置成支持画中画。
在触屏设备设备上,用户可以拖拽PiP窗口到另一个位置,从Android S(12)开始,用户也可以:
单击窗口显示PiP菜单。
双击窗口切换PiP窗口最大或者最小。
通过拖动窗口到窗口边缘,隐藏PiP窗口,如果要取消隐藏,可以点击可见部分或直接将拖拽出来。
通过双指缩放调整PiP大小。
默认系统不支持App进入PiP模式,需要在App manifest里设置android:supportsPictureInPicture="true"
,并指定activity处理configuration改变来防止activity重启。
<activity android:name="VideoActivity" android:supportsPictureInPicture="true" android:configChanges= "screenSize|smallestScreenSize|screenLayout|orientation" ...
在移动设备上从Android12开始,可以通过给activity设置setAutoEnterEnabled
flag为true,就不用在onUserLeaveHint
时调用enterPictureInPictureMode()
方法进入PiP了。
进入和退出PiP时会触发Activity.onPictureInPictureModeChanged()
或Fragment.onPictureInPictureModeChanged()
方法。需要重写这些回调方法来重新布局activity。当App进入PiP模式的时候,用户无法与app的UI元素交互,小窗口页面不需要呈现太多内容。
@Override public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Configuration newConfig) { if (isInPictureInPictureMode) { // Hide the full-screen UI (controls, etc.) while in PiP mode. } else { // Restore the full-screen UI. ... } }
原生通过PictureInPictureParams.Builder.setActions()
方法来设置交互,比如视频暂停、播放等。
当activity进入PiP模式后,会触发onPause()
生命周期,需要在这里做特殊处理,比如全屏播放时进入PiP不需要暂停视频,而其他情况下onPause()
后需要暂停,可以这么处理。
@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. ... } }
在onPause()
里通过isInPictureInPictureMode()
方法判断当前是否处于PiP模式。
当activity退出PiP进入全屏模式的时候,会触发onResume()
生命周期。
本文为Adamin90原创文章,转载无需和我联系,但请注明来自http://www.lixiaopeng.top