敬请期待 12L,这是一次将于明年年初面向大屏设备推出的功能投放。立即试用!

画中画 (PiP) 改进

Android 12 针对画中画 (PiP) 模式引入了行为改进和新功能。

点按一次和点按两次的行为改进

Android 12 改进了点按一次和点按两次的画中画行为,具体说明如下:

  • 现在,点按一次画中画窗口会为用户显示控件。以前,点按一次会展开画中画窗口并显示控件。

  • 现在,点按两次画中画窗口会在当前画中画大小与最大画中画大小之间切换。以前,点按两次会离开画中画模式而改为全屏模式。

新功能

Android 12 针对画中画模式引入了以下新功能:

用于在手势导航中更流畅地过渡到画中画模式的新 API 标志

Android 12 可让您使用新的 setAutoEnterEnabled 标志,在手势导航模式下向上滑动转到主屏幕时更流畅地过渡到画中画模式。以前,Android 会等到“向上滑动转到主屏幕”动画结束,然后再淡入画中画窗口。

如需实现此功能,请执行以下操作:

  1. 使用 setAutoEnterEnabled 构造 PictureInPictureParams.Builder,如下所示:

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. 尽早使用最新的 PictureInPictureParams 调用 setPictureInPictureParams。应用不应等待 onUserLeaveHint 回调(就像在 Android 11 中所做的那样)。

    例如,应用可能要在第一次播放以及后续任何一次播放时(如果宽高比发生了变化)调用 setPictureInPictureParams

  3. 根据需要调用 setAutoEnterEnabled(false)。例如,如果当前播放处于暂停状态,则视频应用进入画中画模式可能不是最佳选择。

用于为非视频内容停用无缝大小调整的新 API 标志

Android 12 添加了 SeamlessResizeEnabled 标志,在画中画窗口中调整非视频内容的大小时,该标志可提供更流畅的交替淡变动画。以前,在画中画窗口中调整非视频内容的大小时会产生烦人的视觉伪影。

为了向后兼容,默认情况下,将 setSeamlessResizeEnabled 标志设置为 true。对于视频内容,请将其设置保留为 true;对于非视频内容,请将其更改为 false

如需停用非视频内容的无缝大小调整,请编写以下代码:

  setPictureInPictureParams(new PictureInPictureParams.Builder()
          .setSeamlessResizeEnabled(false)
          .build());

退出画中画模式时支持更流畅的动画

在 Android 12 中,SourceRectHint 标志现在重用于在退出画中画模式时实现更流畅的动画。退出时,系统会使用当前可用的 sourceRectHint 创建动画,无论它是用于进入画中画模式的原始 Rect,还是应用提供的更新后的 Rect

如需实现此功能,请按以下方式更新您的应用:

  1. 继续使用 sourceRectHintaspectRatio 构造 PictureInPictureParams,以实现流畅的进入动画。

  2. 如有必要,请在系统开始退出过渡之前更新 sourceRectHint。当系统即将退出画中画模式时,activity 的视图层次结构会布局成其目标配置(例如全屏)。应用可以将布局更改监听器附加到其根视图或目标视图(如视频播放器视图),以检测事件并在动画开始前更新 sourceRectHint。

      // Listener is called immediately after the user exits PIP but before animating.
      playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                           oldLeft, oldTop, oldRight, oldBottom ->
          if (left != oldLeft || right != oldRight || top != oldTop
                  || bottom != oldBottom) {
             // The playerView's bounds changed, update the source hint rect to
             // reflect its new bounds.
             val sourceRectHint = Rect()
             playerView.getGlobalVisibleRect(sourceRectHint)
             setPictureInPictureParams(
                 PictureInPictureParams.Builder()
                     .setSourceRectHint(sourceRectHint)
                     .build()
             )
          }
      }
    

支持新手势

Android 12 现在支持对画中画窗口使用隐藏和“双指张合即可缩放”手势:

  • 如需隐藏窗口,用户可以将窗口拖动到左侧或右侧边缘。如需取消隐藏窗口,用户可以点按已隐藏窗口的可见部分或将其拖出。

  • 用户现在可以使用“双指张合即可缩放”手势调整画中画窗口的大小。