Pencere Bulanıklıkları

Android 12'de, pencere bulanıklaştırma efektleri (arka plan bulanıklığı ve arka bulanıklık gibi) uygulamak için genel API'ler mevcuttur. Kodda, geliştirici belgelerinde veya UI notasyonunda pencere bulanıklığı olarak da adlandırılan pencere bulanıklığını görseniz de, çapraz pencere bulanıklığı, pencere bulanıklığı ile aynı şeydir.

Bu API'ler ile kendi pencerenizin arkasında ne varsa bulanıklaştırabilirsiniz. Bulanık arka plana sahip pencereler oluşturabilir, buzlu cam efekti oluşturabilir veya arkalarında tüm ekran bulanık olarak pencereleri göstererek bir alan derinliği yaratabilirsiniz. Ayrıca iki efekti birleştirebilirsiniz.

sadece arka plan bulanıklığı

1

sadece arkasını bulanıklaştır

2

arka ve arka plan bulanıklığı

3

Şekil 1. Yalnızca arka planda bulanıklık (1), yalnızca arkada bulanıklık (2), arka planda bulanıklık ve arkada bulanıklık (3)

Pencere bulanıklaştırma özelliği, pencereler arasında çalışır; bu, görüntülediğiniz pencerenin arkasında başka bir uygulama olduğunda da çalıştığı anlamına gelir. Bu, aynı uygulamadaki bir pencerenin içindeki içeriği bulanıklaştıran bulanıklaştırma oluşturma efektiyle aynı değildir. Pencere bulanıklıkları, iletişim kutuları, alt sayfalar ve diğer kayan pencereler için kullanışlıdır.

Bu özelliğin önemli ölçüde GPU kaynakları kullandığını unutmamak önemlidir. Bu nedenle, tüm Android cihazlar için mevcut olmasına rağmen, yalnızca yeterli GPU gücüne sahip cihazlarda desteklenir.

uygulama

OEM'ler ve ortaklar

Pencere bulanıklıkları varsayılan olarak devre dışıdır. Cihazlarda bulanıklaştırma işlevini etkinleştirmek için aşağıdakileri yapın:

  • Cihazın ekstra GPU yükünü kaldırabileceğinden emin olun - bulanıklaştırma işlemi pahalıdır ve alt uç cihazlarda karelerin düşmesine neden olabilir. Bunu yalnızca yeterli GPU gücüne sahip cihazlarda etkinleştirin.
  • librenderengine bulanıklaştırma mantığını uyguladığından emin olun - varsayılan Android 12 oluşturma motoru yapar, ancak herhangi bir özel oluşturma motorunun bulanıklaştırma mantığını kendisinin uygulaması gerekir.
  • Aşağıdaki yüzey fırlatıcı sysprop'u ayarlayarak bulanıklıkları etkinleştirin:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

Üçüncü Taraf Geliştiriciler

Örnek kodu görmek için Örnekler ve Kaynak bölümüne bakın. Pencere bulanıklıkları çalışma zamanında sistem sunucusu tarafından devre dışı bırakılabilir. Bu nedenle, bir uygulama geri dönüşlü, bulanık olmayan bir sürüm sağlamalıdır. Aksi takdirde, bulanıklıklar devre dışı bırakıldığı için oluşturulamıyorsa, pencere arka planı o kadar şeffaf olabilir ki, pencerenin içindeki içerik okunamaz hale gelebilir. Uygulamanız bir yedek uygulama sürümü sağlamıyorsa, kullanıcı arayüzünüzün hem bulanıklaştırma etkin, hem de bulanıklaştırma devre dışıyken çalıştığından emin olun. Bulanıklaştırmanın herhangi bir zamanda devre dışı bırakılabileceği üç koşul şunlardır:

  1. Cihaz, Android 11 veya daha eski bir sürümü çalıştırıyor. Pencere bulanıklaştırmaları yalnızca Android 12 ve sonraki sürüm cihazlarda kullanılabildiğinden, uygulamaların Android 11 ve önceki sürümlerini çalıştıran cihazlar için geri dönüşlü, bulanık olmayan bir deneyim alternatifi uygulaması gerekir.
  2. Cihaz, pahalı oldukları için pencere bulanıklıklarını desteklemez, bu nedenle alt uç cihazlar, bunları oluştururken kareleri düşürebilir. Bu gibi durumlarda, uygulamaların bulanık olmayan bir geri dönüş deneyimi sağlaması gerekir.
  3. Sistem sunucusu (örneğin, Pil Tasarrufu modu sırasında veya bir geliştirici ayarı veya tünel modu nedeniyle) çalışma zamanında bulanıklığı devre dışı bırakır.

Yukarıdaki 2. ve 3. noktaların her ikisi de WindowManager.addCrossWindowBlurEnabledListener ile kayıtlı bir dinleyici tarafından bildirilir. Uygulamalarınız bulanıklaştırma API'lerini kullanıyorsa, bu dinleyiciyi kaydedin ve bulanıklaştırma etkin ve bulanıklaştırma devre dışı durumlar için farklı bir kullanıcı arabirimi kullanmak istiyorsanız, dinleyici her çağrıldığında kullanıcı arabiriminizi güncelleyin. Kaydedildiğinde, dinleyici, bulanıklıkların etkin olup olmadığını bildirmek için hemen çağrılır.

Aşağıdaki yöntemleri kullanarak bulanıklık işlevlerini uygulayın:

Örnekler ve kaynak

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);
   }

Pencere bulanıklığını açma ve kapatma

Pencere bulanıklıklarına izin vermenin ve vermemenin iki yolu vardır.

  1. Kullanıcı arayüzünden:

    Ayarlar -> Sistem -> Geliştirici seçenekleri -> Donanım hızlandırmalı oluşturma -> Pencere düzeyinde bulanıklaştırmaya izin ver

  2. Terminalden (cihaz köklü olmalıdır):

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

Pencere bulanıklaştırma işlevini yalnızca cihazınızın bulanıklaştırmayı destekleme özelliği varsa açabilir veya kapatabilirsiniz. (Pencere bulanıklaştırmayı desteklemeyen cihazlar özelliği etkinleştiremez.) Varsayılan olarak, bulanıklaştırmalar onları destekleyen cihazlarda etkinleştirilmiştir.

Cihazlarınız için bulanıklaştırmayı etkinleştirdiğinizde, pil tasarrufu modu veya multimedya tünelleme gibi diğer şeylerin bunları devre dışı bırakabileceğini düşünün. Bulanıklaştırmalar, tüm gerekli koşullar karşılandığında etkinleştirilir; bunlar desteklenir ve hiçbir şey onları devre dışı bırakmaz. Bulanıklaştırma işlevinin mevcut durumunun "etkin" olup olmadığını görmek için adb shell wm disable-blur komutunu kullanın.

doğrulama

Bulanıklaştırma özellikleri sürümünüzün istediğiniz gibi çalışmasını sağlamak için, blurEnabled değiştiğinde ( addCrossWindowBlurEnabledListener tarafından bildirildiği gibi) UI öğelerini yeniden çizecek şekilde UI mantığını uygulayın.

  1. Bulanıklığa sahip kullanıcı arayüzünü açın.
  2. Kullanıcı arabiriminden veya CLI'den Pencere bulanıklığını açma ve kapatma için verilen adımları kullanın.
  3. Kullanıcı arabiriminin beklendiği gibi bulanık olmayan bir kullanıcı arayüzüne geçtiğini doğrulayın.

Sorun giderme

Doğrulama sırasında sorun giderme için aşağıdakileri kılavuz olarak kullanın.

Bulanıklık çizilmedi

  • CLI'yi kullanarak veya Ayarlar'a giderek bulanıklaştırmaların etkin olduğunu (ve donanımınızın bunları desteklediğini) doğrulayın.

    1. Bu aygıtta bulanıklaştırmaların desteklenip desteklenmediğini ve şu anda etkin olup olmadığını yazdıran adb shell wm disable-blur komutunu kullanın.
    2. Ayarlar -> Sistem -> Geliştirici seçenekleri -> Donanım hızlandırmalı oluşturma -> Pencere düzeyinde bulanıklıklara izin ver seçeneğine gidin. Seçeneği orada bulamazsanız, cihazınızda bulanıklaştırma desteklenmiyor.
  • Yarı saydam bir pencere arka plan rengi ayarladığınızdan emin olun; opak bir pencere arka plan rengi, bulanık alanı gizler (örtür).

Test cihazı, pencere bulanıklığını desteklemiyor

  • Uygulamanızı Android 12 öykünücüsünde test edin. Bir Android öykünücüsü kurmak için Bir Android öykünücüsü kurma yönergelerine bakın. Öykünücüyle oluşturduğunuz herhangi bir Android sanal cihazı, pencere bulanıklıklarını destekleyecektir.

Yuvarlatılmış köşeler yok

  • Çizilebilir bir pencere arka planı ayarlayarak yuvarlatılmış köşeleri tanımlayın - Window#setBackgroundDrawable . Bu, bulanıklık alanının ana hatlarını belirler.

Geliştirici seçeneğinin güncellenmesi bulanıklaştırmayı etkinleştirmez

  • Cihazın pil tasarrufu modunda olup olmadığını, multimedya tüneli kullanıp kullanmadığını (TV için) veya başka bir şeyin bulanıklık işlevini devre dışı bırakıp bırakmadığını kontrol edin.

Pencere sınırları içinde değil, tam ekran çizilmiş arka plan bulanıklığı

  • Pencerenizin kayan olarak işaretlendiğinden emin olun - android:windowIsFloating
  • Çizilebilir bir pencere arka planı ayarladığınızdan emin olun - Window#setBackgroundDrawable . Bu, bulanıklık alanının ana hatlarını belirler.

Dinleyiciden gelen güncellemeler ekrana uygulanmıyor

  • Dinleyici tarafından çalıştırılan örnek güncellenmezken pencerenin yok edilip edilmediğini ve yeniden oluşturulup oluşturulmadığını kontrol edin. Dinleyici güncellemeleri eski bir pencere örneğine uygulanıyor olabilir.