Pencere Bulanıklıkları

Android 12'de, pencere bulanıklaştırma efektleri (arka plan bulanıklığı ve arkadaki bulanıklık gibi) uygulamak için genel API'ler mevcuttur. Kodda, geliştirici belgelerinde veya UI gösteriminde 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 pencereleri arkalarında tüm ekran bulanık olarak göstererek bir alan derinliği efekti oluşturabilirsiniz. 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. Arka plan bulanıklığı sadece (1) arkasında, arkasında, (2), bir arka plan bulanıklığı ve bulanıklığı bulanıklık (3)

Pencere bulanıklaştırma özelliği tüm pencerelerde ç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ı değildir bulanıklık hale etkisi aynı uygulama içinde bir pencere içinde içerik bulanıklaştırma. Pencere bulanıklıkları, iletişim kutuları, alt sayfalar ve diğer kayan pencereler için kullanışlıdır.

Bu özelliğin önemli 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.
  • Senin emin olun librenderengine Varsayılan Android 12 motor yapar hale, ancak herhangi bir özel motor bulanık mantık kendisi uygulamalıdır render - uygular bulanık mantık.
  • 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

Bakın Örnekler ve Kaynak örnek kodunu görmek için bölüm. 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ıkları 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ırmalar etkinken hem de bulanıklaştırmalar 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 gelmez bunları işlerken onlar sizsiniz, pahalı, bu yüzden alt-uç cihazlar çerçeveleri çekebileceklerini çünkü pencere bulanıklaştırma destekler. Bu gibi durumlarda, uygulamaların bulanık olmayan bir geri dönüş deneyimi sağlaması gerekir.
  3. Sistem sunucu (örneğin, Batarya Tasarrufu modunda ya bağlı bir geliştirici ayarı veya tünel moduna) zamanında bulanıklığı devre dışı bırakır.

Puan 2 ve 3 yukarıdaki hem kayıtlı bir dinleyici tarafından rapor edilmiştir WindowManager.addCrossWindowBlurEnabledListener . 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. Blurs gerekli tüm koşullar yerine-Onlar desteklenen olduğunda etkindir ve hiçbir şey onları devre dışı bırakmayı edilir. Bulanıklık işlevselliği mevcut durumu "etkin" olup olmadığını görmek için kullanmak adb shell wm disable-blur komutu.

doğrulama

Bulanıklık sürümünüz amaçlandığı gibi eserler, bu nedenle zaman UI öğeleri yeniden çizer o UI mantığı uygulamak özellikleri sağlamak için blurEnabled (tarafından bildirilen değişiklikleri addCrossWindowBlurEnabledListener ).

  1. Bulanıklığa sahip kullanıcı arayüzünü açın.
  2. İçin verilen adımları kullanın ve kapatma pencere bulanıklığı açma kullanıcı arayüzünden veya CLI tarafından.
  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

  • Bulanıklıklar şu anda etkin (ve donanım destekleri onları o) biri tarafından CLI kullanarak veya Ayarlar'a giderek doğrulayın.

    1. Kullanım adb shell wm disable-blur bulanıklık söz konusu cihazda desteklenir yapıp yapmadığını, şu anda etkin olup olmadığını yazdırır komutu.
    2. Ayarlar gidin -> Sistem -> Geliştirici seçenekleri -> Donanım render hızlandırılmış -> pencere düzeyinde bulanıklaştırma izin verin. 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 emülatörü kurmak için, bakınız bir Android emülatörü kadar Set yönde. Öykünücüyle oluşturduğunuz herhangi bir Android sanal cihazı, pencere bulanıklıklarını destekleyecektir.

Yuvarlatılmış köşeler yok

  • - Bir pencere arka plan çizilebilir 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ünelleme (TV için) kullanıp kullanmadığını veya bulanıklaştırma işlevini başka bir şeyin 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ığı

  • Pencere yüzen olarak işaretlenmiş olduğundan emin olun - android:windowIsFloating
  • - Bir pencere arka plan çizilebilir belirledik 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.