Jendela Kabur

Di Android 12 tersedia API publik untuk menerapkan efek buram jendela (seperti buram latar belakang dan buram di belakang). Perhatikan bahwa meskipun Anda mungkin melihat keburaman jendela yang juga disebut keburaman lintas-jendela dalam kode, dokumentasi pengembang, atau notasi UI, keburaman lintas-jendela adalah hal yang sama dengan keburaman jendela.

Dengan API ini, Anda dapat mengaburkan apa pun yang ada di balik jendela Anda sendiri. Anda dapat membuat jendela dengan latar belakang buram, membuat efek kaca buram, atau menampilkan jendela dengan seluruh layar di belakangnya buram, menciptakan efek kedalaman bidang. Anda juga dapat menggabungkan kedua efek tersebut.

latar belakang kabur saja

1

kabur di belakang saja

2

belakang dan latar belakang kabur

3

Gambar 1. Latar belakang blur saja (1), blur di belakang saja (2), blur latar belakang dan blur di belakang (3)

Fitur buram jendela berfungsi di seluruh jendela, yang berarti juga berfungsi saat ada aplikasi lain di belakang jendela yang Anda lihat. Ini tidak sama dengan efek blur render , yang memburamkan konten di dalam jendela dalam aplikasi yang sama . Pengkaburan jendela berguna untuk dialog dan lembar bawah, dan jendela mengambang lainnya.

Penting untuk dicatat bahwa fitur ini menggunakan sumber daya GPU yang signifikan. Jadi meskipun tersedia untuk semua perangkat Android, ini hanya didukung pada perangkat yang memiliki daya GPU yang cukup.

Penerapan

OEM dan mitra

Pengaburan jendela dinonaktifkan secara default. Untuk mengaktifkan fungsionalitas blur pada perangkat, lakukan hal berikut:

  • Pastikan perangkat dapat menangani beban GPU ekstra - operasi blur itu mahal dan pada perangkat kelas bawah, ini dapat menyebabkan bingkai jatuh. Hanya aktifkan ini pada perangkat dengan daya GPU yang cukup.
  • Pastikan librenderengine Anda mengimplementasikan logika pemburaman - mesin render Android 12 default melakukannya, tetapi mesin render kustom apa pun harus mengimplementasikan logika pemburaman itu sendiri.
  • Aktifkan blur dengan menyetel sysprop flinger permukaan berikut:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

Pengembang Pihak Ketiga

Lihat bagian Contoh dan Sumber untuk melihat kode contoh. Pengaburan jendela dapat dinonaktifkan saat runtime oleh server sistem. Oleh karena itu, aplikasi harus menyediakan versi fallback dan tanpa blur. Jika tidak, jika blur tidak dirender karena dinonaktifkan, latar belakang jendela mungkin sangat transparan sehingga konten di dalam jendela menjadi tidak terbaca. Jika aplikasi Anda tidak menyediakan versi aplikasi fallback, pastikan UI Anda berfungsi dengan blur diaktifkan dan blur dinonaktifkan. Ini adalah tiga kondisi di mana blur dapat dinonaktifkan kapan saja:

  1. Perangkat menjalankan Android 11 atau lebih rendah. Karena pemburaman jendela hanya tersedia di Android 12 dan perangkat yang lebih tinggi, aplikasi harus menerapkan alternatif pengalaman fallback dan tanpa pemburaman untuk perangkat yang menjalankan Android 11 dan lebih rendah.
  2. Perangkat tidak mendukung pemburaman jendela karena harganya mahal, sehingga perangkat kelas bawah mungkin menjatuhkan bingkai saat merendernya. Untuk kasus seperti itu, aplikasi harus memberikan pengalaman fallback tanpa blur.
  3. Server sistem (misalnya, selama mode Penghemat Baterai, atau karena pengaturan pengembang atau mode terowongan) menonaktifkan blur saat runtime.

Poin 2 dan 3 di atas keduanya dilaporkan oleh pendengar yang terdaftar di WindowManager.addCrossWindowBlurEnabledListener . Jika aplikasi Anda menggunakan API blur, daftarkan listener ini dan perbarui UI Anda setiap kali listener dipanggil, jika Anda ingin menggunakan UI yang berbeda untuk status yang mengaktifkan blur dan menonaktifkan blur. Ketika terdaftar, pendengar dipanggil segera untuk melaporkan apakah blur saat ini diaktifkan.

Terapkan fungsionalitas blur dengan menggunakan metode berikut:

Contoh dan sumber

public class BlurActivity extends Activity {
   private final int mBackgroundBlurRadius = 150;
   private final Drawable mBackgroundDrawableWithBlur;
   private final Drawable mBackgroundDrawableNoBlur;

   private final int mBlurBehindRadius = 50;
   private final float mDimAmountWithBlur = 0.1f;
   private final float mDimAmountNoBlur = 0.6f;


   private Consumer<Boolean> mCrossWindowBlurEnabledListener = enabled -> {
       getWindow().setBackgroundDrawable(
               enabled ? mBackgroundDrawableWithBlur : mBackgroundDrawableNoBlur);
       getWindow().setDimAmount(enabled ? mDimAmountWithBlur : mDimAmountNoBlur);
   };

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.blur_activity);

       mBackgroundDrawableWithBlur = getContext().getResources().getDrawable(
               R.drawable.window_background_with_blur);
       mBackgroundDrawableNoBlur = getContext().getResources().getDrawable(
               R.drawable.window_background_no_blur);

       if (Android version >= Android S) {
           getWindow().addFlags(
                   WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
           window.getAttributes().setBlurBehindRadius(mBlurBehindRadius);
           window.setBackgroundBlurRadius(mBackgroundBlurRadius);
           getWindow().getDecorView().addOnAttachStateChangeListener(
                                         new View.OnAttachStateChangeListener() {
                    @Override
                    public void onViewAttachedToWindow(View v) {
                        getWindowManager().addCrossWindowBlurEnabledListener(
                                                     blurEnabledListener);
                    }

                       @Override
                   public void onViewDetachedFromWindow(View v) {
                       getWindowManager().removeCrossWindowBlurEnabledListener(
                                                      blurEnabledListener);
                     }
           });
       }
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
   }

Mengaktifkan dan menonaktifkan keburaman jendela

Ada dua cara untuk mengizinkan dan melarang pemburaman jendela.

  1. Dari UI:

    Pengaturan -> Sistem -> Opsi pengembang -> Render yang dipercepat perangkat keras -> Izinkan pengaburan tingkat jendela

  2. Dari terminal (perangkat harus di-root):

adb shell wm disable-blur 1 # 1 disables window blurs, 0 allows them

Anda hanya dapat mengaktifkan atau menonaktifkan fungsionalitas pemburaman jendela jika perangkat Anda memiliki kemampuan untuk mendukung pemburaman. (Perangkat yang tidak mendukung pemburaman jendela tidak dapat mengaktifkan fitur tersebut.) Secara default, pemburaman diaktifkan pada perangkat yang mendukungnya.

Saat Anda mengaktifkan blur untuk perangkat Anda, pertimbangkan bahwa hal-hal lain seperti mode hemat baterai atau tunneling multimedia dapat menonaktifkannya. Pemburaman diaktifkan saat semua kondisi yang diperlukan terpenuhi—kondisi tersebut didukung, dan tidak ada yang menonaktifkannya. Untuk melihat apakah status fungsi blur saat ini "diaktifkan", gunakan perintah adb shell wm disable-blur .

Validasi

Untuk memastikan versi fitur blur Anda berfungsi seperti yang Anda inginkan, terapkan logika UI sehingga menggambar ulang elemen UI setiap kali blurEnabled berubah (seperti yang dilaporkan oleh addCrossWindowBlurEnabledListener ).

  1. Buka UI yang memiliki blur.
  2. Gunakan langkah-langkah yang diberikan untuk Mengaktifkan dan menonaktifkan keburaman jendela dari UI atau oleh CLI.
  3. Verifikasi bahwa UI berubah ke dan dari yang tidak buram seperti yang diharapkan.

Penyelesaian masalah

Gunakan yang berikut ini sebagai panduan untuk pemecahan masalah selama validasi.

Tidak ada blur yang digambar

  • Pastikan blur saat ini diaktifkan (dan perangkat keras Anda mendukungnya) dengan menggunakan CLI atau menavigasi ke Settings .

    1. Gunakan perintah adb shell wm disable-blur , yang mencetak apakah blur didukung pada perangkat itu dan apakah saat ini diaktifkan.
    2. Arahkan ke Pengaturan -> Sistem -> Opsi pengembang -> Perenderan yang dipercepat perangkat keras -> Izinkan pengaburan tingkat jendela . Jika Anda tidak dapat menemukan opsi di sana, blur tidak didukung di perangkat Anda.
  • Pastikan Anda mengatur warna latar belakang jendela yang tembus cahaya; warna latar belakang jendela buram menyembunyikan (menutupi) area buram.

Perangkat uji tidak mendukung pengaburan jendela

  • Uji aplikasi Anda di emulator Android 12. Untuk menyiapkan emulator Android, lihat petunjuk Menyiapkan emulator Android . Perangkat virtual Android apa pun yang Anda buat dengan emulator akan mendukung pemburaman jendela.

Tidak ada sudut membulat

  • Tentukan sudut membulat dengan mengatur gambar latar belakang jendela - Window#setBackgroundDrawable . Ini menentukan garis besar area buram.

Memperbarui opsi pengembang tidak mengaktifkan blur

  • Periksa apakah perangkat dalam mode hemat baterai, jika menggunakan tunneling multimedia (untuk TV), atau jika ada hal lain yang menonaktifkan fungsi blur.

Latar belakang buram digambar layar penuh, bukan di dalam batas jendela

  • Pastikan jendela Anda ditandai sebagai mengambang - android:windowIsFloating
  • Pastikan Anda telah menyetel drawable latar belakang jendela - Window#setBackgroundDrawable . Ini menentukan garis besar area buram.

Pembaruan dari pendengar tidak diterapkan di layar

  • Periksa apakah jendela dihancurkan dan dibuat ulang saat instance yang dioperasikan oleh listener tidak diperbarui. Pembaruan pendengar mungkin diterapkan ke instance jendela lama.