Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

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 blur membuat efek , yang mengaburkan isi 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

Pemburaman 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 bahwa Anda librenderengine alat logika kabur - default Android 12 mesin render tidak, tetapi setiap kustom mesin render harus menerapkan logika kabur 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

Mengacu pada Contoh dan Sumber bagian untuk melihat contoh kode. 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 ditampilkan 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 yang lebih rendah.
  2. Perangkat ini tidak mendukung mengaburkan jendela karena harganya mahal, sehingga perangkat yang lebih rendah-end mungkin drop frame saat rendering mereka. Untuk kasus seperti itu, aplikasi harus memberikan pengalaman fallback tanpa blur.
  3. Sistem server (misalnya, selama mode Battery Saver, atau karena pengaturan pengembang atau mode tunnel) menonaktifkan blur pada saat runtime.

Poin 2 dan 3 di atas keduanya dilaporkan oleh pendengar terdaftar 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 blur-enabled dan blur-disabled. 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 -> Perenderan 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. Mengaburkan diaktifkan ketika semua kondisi yang diperlukan adalah bertemu-mereka didukung, dan tidak ada yang menonaktifkan mereka. Untuk melihat apakah keadaan saat ini fungsi blur adalah "diaktifkan," menggunakan adb shell wm disable-blur perintah.

Validasi

Untuk memastikan versi blur fitur karya seperti yang Anda inginkan, menerapkan logika UI sehingga menggambar ulang elemen UI setiap kali blurEnabled perubahan (seperti dilansir addCrossWindowBlurEnabledListener ).

  1. Buka UI yang memiliki blur.
  2. Gunakan langkah-langkah yang diberikan untuk Menghidupkan jendela blur dan mematikan dari UI atau 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

  • Verifikasi yang kabur saat diaktifkan (dan bahwa Anda mendukung hardware mereka) dengan baik menggunakan CLI atau menavigasi ke Settings.

    1. Gunakan adb shell wm disable-blur perintah, yang mencetak apakah mengaburkan yang didukung pada perangkat itu dan apakah mereka saat ini diaktifkan.
    2. Arahkan ke Settings -> System -> Opsi pengembang -> Hardware accelerated rendering -> Izinkan mengaburkan jendela-tingkat. 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 mendirikan sebuah emulator Android, merujuk pada Set up sebuah emulator Android arah. Perangkat virtual Android apa pun yang Anda buat dengan emulator akan mendukung pemburaman jendela.

Tidak ada sudut membulat

  • Tentukan sudut membulat dengan menetapkan ditarik jendela latar belakang - 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 kabur digambar layar penuh, bukan di dalam batas jendela

  • Pastikan bahwa jendela Anda ditandai sebagai mengambang - android:windowIsFloating
  • Pastikan bahwa Anda telah menetapkan ditarik jendela latar belakang - 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.