Peningkatan Picture-in-Picture (PiP)

Android 12 memperkenalkan peningkatan perilaku dan fitur baru untuk mode picture-in-picture (PiP).

Peningkatan perilaku untuk ketuk sekali dan ketuk dua kali

Android 12 telah meningkatkan perilaku PiP untuk ketuk sekali dan ketuk dua kali sebagai berikut:

  • Sekarang, ketuk sekali di jendela PiP akan menampilkan kontrol untuk pengguna. Sebelumnya, ketuk sekali akan memperluas jendela PiP dan kontrol yang ditampilkan.

  • Sekarang, ketuk dua kali di jendela PiP akan mengalihkan antara ukuran PiP saat ini dan ukuran PiP maksimum. Sebelumnya, ketuk dua kali mode PiP kiri untuk mengaktifkan mode layar penuh.

Fitur baru

Android 12 memperkenalkan fitur baru berikut untuk mode PiP:

Flag API baru untuk transisi yang lebih lancar ke mode PiP dalam navigasi gestur

Dengan Android 12, Anda dapat menggunakan flag setAutoEnterEnabled baru untuk memberikan transisi yang lebih lancar ke mode PiP saat menggeser ke beranda dalam mode navigasi gestur. Sebelumnya, Android menunggu animasi geser ke beranda untuk menyelesaikan sebelum memudar di jendela PiP.

Untuk mengimplementasikan fitur ini:

  1. Gunakan setAutoEnterEnabled untuk membuat PictureInPictureParams.Builder, sebagai berikut:

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. Panggil setPictureInPictureParams menggunakan informasi PictureInPictureParams terbaru lebih awal. Aplikasi tidak perlu menunggu callback onUserLeaveHint (seperti yang akan dilakukan di Android 11).

    Misalnya, aplikasi dapat memanggil setPictureInPictureParams pada pemutaran pertama dan pemutaran berikutnya jika rasio tinggi lebar diubah.

  3. Panggil setAutoEnterEnabled(false) jika perlu. Misalnya, aplikasi video mungkin tidak optimal untuk memasukkan PiP jika pemutaran saat ini dalam keadaan dijeda.

Tag API baru untuk menonaktifkan pengubahan ukuran yang lancar untuk konten non-video.

Android 12 menambahkan flag SeamlessResizeEnabled yang menyediakan animasi cross-fading yang jauh lebih lancar saat mengubah ukuran konten non-video di jendela PiP. Sebelumnya, mengubah ukuran konten non-video di jendela PiP dapat membuat artefak visual yang janggal.

Flag setSeamlessResizeEnabled ditetapkan ke true secara default untuk kompatibilitas mundur. Untuk konten video, biarkan setelan ini ditetapkan pada true dan untuk konten non-video, ubah ke false.

Untuk menonaktifkan pengubahan ukuran konten non-video yang lancar:

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

Dukungan untuk animasi yang lebih halus saat keluar dari mode PiP

Di Android 12, flag SourceRectHint kini digunakan kembali untuk menerapkan animasi yang lebih halus saat keluar dari mode PiP. Saat keluar, sistem akan membuat animasi menggunakan sourceRectHint yang tersedia saat ini, apakah itu Rect asli yang digunakan untuk memasukkan PIP ataukah Rect yang diperbarui yang disediakan oleh aplikasi.

Untuk menerapkan fitur ini, update aplikasi Anda seperti berikut:

  1. Lanjutkan untuk menyusun PictureInPictureParams dengan sourceRectHint dan aspectRatio untuk animasi entri yang lancar.

  2. Jika perlu, update sourceRectHint sebelum sistem memulai transisi keluar. Saat sistem akan keluar dari mode PIP, hierarki tampilan aktivitas diatur ke konfigurasi tujuannya (misalnya, layar penuh). Aplikasi dapat melampirkan pemroses perubahan tata letak ke tampilan root atau tampilan targetnya (seperti tampilan pemutar video) untuk mendeteksi peristiwa dan mengupdate sourceRectHint sebelum animasi dimulai.

      // 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()
             )
          }
      }
    

Dukungan untuk gestur baru

Android 12 kini mendukung gestur sembunyi dan cubit untuk memperbesar untuk jendela PiP:

  • Untuk menyembunyikan jendela, pengguna dapat menarik jendela ke tepi kiri atau kanan. Untuk membatalkan penyembunyian batas jendela, pengguna dapat mengetuk bagian jendela yang disembunyikan atau menyingkapnya.

  • Pengguna kini dapat mengubah ukuran jendela PiP menggunakan cubit untuk memperbesar.