Pencere bulanıklıkları

Android 12'de, arka plan bulanıklığı ve arka bulanıklık gibi pencere bulanıklaştırma efektlerinin uygulanması için genel API'ler mevcuttur.

Pencere bulanıklıkları veya çapraz pencere bulanıklıkları, belirli bir pencerenin arkasındaki ekranı bulanıklaştırmak için kullanılır. Farklı görsel efektler elde etmek için kullanılabilecek iki tür pencere bulanıklığı vardır:

  • Arka planı bulanıklaştırma, arka planı bulanık olan pencereler oluşturarak buzlu cam efekti oluşturmanıza olanak tanır.

  • Arkayı bulanıklaştır, bir (diyalog) penceresinin arkasındaki ekranın tamamını bulanıklaştırarak alan derinliği efekti oluşturmanıza olanak tanır.

İki efekt, aşağıdaki şekilde gösterildiği gibi ayrı ayrı veya bir arada kullanılabilir:

yalnızca arka plan bulanıklığı

A

yalnızca arkası bulanıklaştır

B

arkayı bulanıklaştır ve arka planı bulanıklaştır

C

Şekil 1. Yalnızca arka plan bulanıklığı (a), yalnızca arka plan bulanıklığı (b), arka plan bulanıklığı ve arka bulanıklık (c)

Pencere bulanıklaştırma özelliği tüm pencerelerde çalışır; bu, pencerenizin arkasında başka bir uygulama olduğunda da çalıştığı anlamına gelir. Bu efekt, aynı pencere içindeki içeriği bulanıklaştıran bulanıklaştırma efektiyle aynı değildir. Pencere bulanıklaştırmaları diyaloglar, alt sayfalar ve diğer kayan pencereler için kullanışlıdır.

Uygulama

Uygulama geliştiricileri

Uygulama geliştiricilerinin bulanıklaştırma efekti oluşturmak için bulanıklaştırma yarıçapı sağlaması gerekir. Bulanıklaştırma yarıçapı bulanıklığın ne kadar yoğun olduğunu kontrol eder; yani yarıçap ne kadar yüksek olursa bulanıklık da o kadar yoğun olur. 0 piksellik bulanıklık, bulanıklığın olmadığı anlamına gelir. Arkadaki bulanıklaştırma için, 20 piksellik bir yarıçap, iyi bir alan derinliği etkisi yaratırken, 80 piksellik bir arka plan bulanıklık yarıçapı, iyi bir buzlu cam efekti oluşturur. Performansı önemli ölçüde etkileyeceği için 150 pikselden yüksek bulanıklık yarıçaplarından kaçının.

İstenilen bulanıklaştırma efektini elde etmek ve okunabilirliği artırmak için yarı saydam bir renk katmanıyla tamamlanan bir bulanıklık yarıçapı değeri seçin.

Arka plan bulanıklığı

Temel içeriğin bulanık bir görüntüsü olan bir pencere arka planı efekti oluşturmak için kayan pencerelerde arka plan bulanıklığını kullanın. Pencerenize bulanık bir arka plan eklemek için aşağıdakileri yapın:

  1. Arka plan bulanıklaştırma yarıçapını ayarlamak için Window#setBackgroundBlurRadius(int) öğesini çağırın. Veya pencere temasında R.attr.windowBackgroundBlurRadius değerini ayarlayın.

  2. Pencereyi yarı saydam yapmak için R.attr.windowIsTranslucent değerini true olarak ayarlayın. Bulanıklık pencere yüzeyinin altına çizilir, bu nedenle bulanıklığın görülebilmesi için pencerenin yarı saydam olması gerekir.

  3. İsteğe bağlı olarak, yarı saydam bir renkle çizilebilen dikdörtgen bir pencere arka planı eklemek için Window#setBackgroundDrawableResource(int) öğesini çağırın. Veya pencere temasında R.attr.windowBackground değerini ayarlayın.

  4. Köşeleri yuvarlatılmış bir pencere için, çizilebilir pencere arka planı olarak köşeleri yuvarlatılmış bir ShapeDrawable ayarlayarak bulanık alanın yuvarlatılmış köşelerini belirleyin.

  5. Bulanıklaştırmanın etkin ve devre dışı olduğu durumları yönetin. Daha fazla bilgi için Uygulamalarda pencere bulanıklaştırmayı kullanma yönergeleri bölümüne bakın.

Arkasını bulanıklaştır

Arkadaki bulanıklık, pencerenin arkasındaki ekranın tamamını bulanıklaştırır. Bu efekt, pencerenin arkasındaki ekrandaki herhangi bir şeyi bulanıklaştırarak kullanıcının dikkatini pencere içeriğine yönlendirmek için kullanılır.

Pencerenizin arkasındaki içeriği bulanıklaştırmak için şu adımları izleyin:

  1. Arkada bulanıklığı etkinleştirmek için pencere bayraklarına FLAG_BLUR_BEHIND ekleyin. Veya pencere temasında R.attr.windowBlurBehindEnabled değerini ayarlayın.

  2. Yarıçapın arkasında bulanıklık ayarlamak için WindowManager.LayoutParams#setBlurBehindRadius çağırın. Veya pencere temasında R.attr.windowBlurBehindRadius değerini ayarlayın.

  3. İsteğe bağlı olarak tamamlayıcı bir loş miktar seçin.

  4. Bulanıklaştırmanın etkin ve devre dışı olduğu durumları yönetin. Daha fazla bilgi için Uygulamalarda pencere bulanıklaştırmayı kullanma yönergeleri bölümüne bakın.

Uygulamalarda pencere bulanıklaştırmayı kullanma yönergeleri

Windows bulanıklaştırma desteği aşağıdakilere bağlıdır:

  • Android sürümü: Windows bulanıklaştırma API'leri yalnızca Android 12 ve sonraki sürümlerde kullanılabilir. Android sürümü için cihaz SDK'sını kontrol edin.

  • Grafik performansı: Daha düşük performanslı GPU'lara sahip cihazlar pencere bulanıklığını desteklememeyi seçebilir.

  • Sistem durumu: Sistem sunucusu çalışma zamanında, örneğin pil tasarrufu modunda, belirli video içeriği türlerini oynatırken veya geliştiricinin geçersiz kılması nedeniyle pencere bulanıklığını geçici olarak devre dışı bırakabilir.

Uygulamanızı Android sürümleri, cihazlar ve sistem durumları arasında uyumlu hale getirmek için şu yönergeleri izleyin:

  • Pencere bulanıklaştırmaları etkinleştirildiğinde veya devre dışı bırakıldığında sizi bilgilendirmek için WindowManager#addCrossWindowBlurEnabledListener aracılığıyla bir dinleyici ekleyin. Ayrıca, pencere bulanıklaştırmalarının şu anda etkin olup olmadığını sorgulamak için WindowManager#isCrossWindowBlurEnabled kullanın.

  • Pencere bulanıklığının etkin veya devre dışı durumuna uyum sağlamak amacıyla pencere arka planı için iki versiyon uygulayın.

    Bulanıklaştırmalar etkinleştirildiğinde, bulanıklığın görünür olması için pencere arka planının yarı saydam olması gerekir. Bu durumda, bulanıklaştırma devre dışı bırakıldığında pencere içeriği, alttaki pencerenin içeriğiyle doğrudan örtüşür ve örtüşen pencereyi daha az okunaklı hale getirir. Böyle bir etkiyi önlemek için pencere bulanıklaştırmaları devre dışı bırakıldığında uygulamanın kullanıcı arayüzünü aşağıdaki gibi uyarlayın:

    • Arka plan bulanıklığı için, çizilebilir pencere arka planının alfa değerini artırın, böylece daha opak hale getirin.

    • Arkayı bulanıklaştırmak için, daha yüksek loşluk miktarına sahip bir loş katman ekleyin.

Arka plan bulanıklığı ve arka plan bulanıklığı örneği

Bu bölüm, hem arka bulanıklığı hem de arka plan bulanıklığını kullanan bir etkinliğin çalışan bir örneğini sağlar.

Aşağıdaki MainActivity.java örneği, arkasında 20 piksellik bulanıklaştırma yarıçapı ve 80 piksellik arka plan bulanıklaştırma yarıçapı bulunan bir iletişim kutusudur. Çizilebilir pencere arka planında xml olarak tanımlanan yuvarlatılmış köşelere sahiptir. Farklı Android sürümlerini, farklı cihazları (potansiyel olarak pencere bulanıklaştırmayı desteklemeyen) ve çalışma zamanı bulanıklığının etkinleştirildiği veya devre dışı bırakıldığı değişiklikleri doğru şekilde işler. Pencere arka planı çizilebilir alfasını ve pencere karartma miktarını ayarlayarak diyalog içeriğinin bu koşulların herhangi biri altında okunabilir olmasını sağlar.

public class MainActivity extends Activity {

    private final int mBackgroundBlurRadius = 80;
    private final int mBlurBehindRadius = 20;

    // We set a different dim amount depending on whether window blur is enabled or disabled
    private final float mDimAmountWithBlur = 0.1f;
    private final float mDimAmountNoBlur = 0.4f;

    // We set a different alpha depending on whether window blur is enabled or disabled
    private final int mWindowBackgroundAlphaWithBlur = 170;
    private final int mWindowBackgroundAlphaNoBlur = 255;

    // Use a rectangular shape drawable for the window background. The outline of this drawable
    // dictates the shape and rounded corners for the window background blur area.
    private Drawable mWindowBackgroundDrawable;

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

        mWindowBackgroundDrawable = getDrawable(R.drawable.window_background);
        getWindow().setBackgroundDrawable(mWindowBackgroundDrawable);

        if (buildIsAtLeastS()) {
            // Enable blur behind. This can also be done in xml with R.attr#windowBlurBehindEnabled
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

            // Register a listener to adjust window UI whenever window blurs are enabled/disabled
            setupWindowBlurListener();
        } else {
            // Window blurs are not available prior to Android S
            updateWindowForBlurs(false /* blursEnabled */);
        }

        // Enable dim. This can also be done in xml, see R.attr#backgroundDimEnabled
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }

    /**
     * Set up a window blur listener.
     *
     * Window blurs might be disabled at runtime in response to user preferences or system states
     * (e.g. battery saving mode). WindowManager#addCrossWindowBlurEnabledListener allows to
     * listen for when that happens. In that callback we adjust the UI to account for the
     * added/missing window blurs.
     *
     * For the window background blur we adjust the window background drawable alpha:
     *     - lower when window blurs are enabled to make the blur visible through the window
     *       background drawable
     *     - higher when window blurs are disabled to ensure that the window contents are readable
     *
     * For window blur behind we adjust the dim amount:
     *     - higher when window blurs are disabled - the dim creates a depth of field effect,
     *       bringing the user's attention to the dialog window
     *     - lower when window blurs are enabled - no need for a high alpha, the blur behind is
     *       enough to create a depth of field effect
     */
    @RequiresApi(api = Build.VERSION_CODES.S)
    private void setupWindowBlurListener() {
        Consumer<Boolean> windowBlurEnabledListener = this::updateWindowForBlurs;
        getWindow().getDecorView().addOnAttachStateChangeListener(
                new View.OnAttachStateChangeListener() {
                    @Override
                    public void onViewAttachedToWindow(View v) {
                        getWindowManager().addCrossWindowBlurEnabledListener(
                                windowBlurEnabledListener);
                    }

                    @Override
                    public void onViewDetachedFromWindow(View v) {
                        getWindowManager().removeCrossWindowBlurEnabledListener(
                                windowBlurEnabledListener);
                    }
                });
    }

    private void updateWindowForBlurs(boolean blursEnabled) {
        mWindowBackgroundDrawable.setAlpha(blursEnabled && mBackgroundBlurRadius > 0 ?
                mWindowBackgroundAlphaWithBlur : mWindowBackgroundAlphaNoBlur);
        getWindow().setDimAmount(blursEnabled && mBlurBehindRadius > 0 ?
                mDimAmountWithBlur : mDimAmountNoBlur);

        if (buildIsAtLeastS()) {
            // Set the window background blur and blur behind radii
            getWindow().setBackgroundBlurRadius(mBackgroundBlurRadius);
            getWindow().getAttributes().setBlurBehindRadius(mBlurBehindRadius);
            getWindow().setAttributes(getWindow().getAttributes());
        }
    }

    private static boolean buildIsAtLeastS() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S;
    }
}

Pencere için yuvarlatılmış köşeler oluşturmak için, res/drawable/window_background.xml dosyasındaki pencere arka planını, 20 dp yarıçaplı yuvarlatılmış köşelere sahip bir ShapeDrawable olarak tanımlarız:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners android:radius="20dp"/>
    <solid android:color="#AAAAAA"/>
</shape>

Pencere bulanıklıkları, etkinliğin altındaki pencerenin içeriğini bulanıklaştırır. Bulanık görüntü bu etkinlik penceresinin altına çizilir, bu nedenle bulanıklığın görünür olabilmesi için etkinlik penceresinin yarı saydam olması gerekir. Pencereyi yarı saydam yapmak için etkinlik temasında R.attr.windowIsTranslucent'i aşağıdaki gibi ayarladık:

<style name="Theme.BlurryDialog" parent="Theme.MaterialComponents.Dialog">
    <item name="android:windowIsTranslucent">true</item>
</style>

OEM'ler ve ortaklar

Bir aygıtta pencere bulanıklaştırmanın yapılabilmesi için OEM'in aygıtın pencere bulanıklaştırmayı desteklediğini beyan etmesi gerekir.

Cihazınızın pencere bulanıklaştırmayı destekleyip desteklemediğini kontrol etmek için aşağıdakileri yapın:

  • Cihazın ekstra GPU yükünü kaldırabileceğinden emin olun. Alt uç cihazlar ekstra yükü kaldıramayabilir ve bu da karelerin düşmesine neden olabilir. Pencere bulanıklaştırmalarını yalnızca yeterli GPU gücüne sahip test edilmiş cihazlarda etkinleştirin.

  • Özelleştirilmiş bir işleme motorunuz varsa işleme motorunuzun bulanıklaştırma mantığını uyguladığından emin olun. Varsayılan Android 12 işleme motoru, BlurFilter.cpp dosyasındaki bulanıklaştırma mantığını uygular.

Cihazınızın pencere bulanıklığını destekleyebildiğinden emin olduktan sonra aşağıdaki yüzey fırlatıcı sysprop ayarlayın:

PRODUCT_VENDOR_PROPERTIES += \
       ro.surface_flinger.supports_background_blur=1

Doğrulama

Bulanıklaştırma etkin ve bulanıklaştırma devre dışı durumları arasında geçiş yaparken uygulama pencerenizin düzgün şekilde işlendiğini doğrulamak için şu adımları izleyin:

  1. Bulanık olan kullanıcı arayüzünü açın.

  2. Pencere bulanıklığını açıp kapatarak pencere bulanıklığını etkinleştirin veya devre dışı bırakın.

  3. Pencere kullanıcı arayüzünün beklendiği gibi bulanık duruma geçtiğini ve bulanık durumdan çıktığını doğrulayın.

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

Pencere kullanıcı arayüzünün pencere bulanıklaştırma efektiyle nasıl görüntülendiğini test etmek için aşağıdaki yöntemlerden birini kullanarak bulanıklaştırmayı etkinleştirin veya devre dışı bırakın:

  • Geliştirici Seçeneklerinden:

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

  • Root erişimli bir cihazdaki terminalden:

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

Android 12+ cihazınızın pencere bulanıklaştırmayı destekleyip desteklemediğini ve pencere bulanıklaştırmanın şu anda etkin olup olmadığını kontrol etmek için root yetkisine sahip bir cihazda adb shell wm disable-blur çalıştırı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ıklaştırmaların şu anda etkin olduğunu ve donanımınızın bunları desteklediğini doğrulayın. Pencere bulanıklığını açma ve kapatma konusuna bakın.

  • Yarı saydam bir pencere arka plan rengi ayarladığınızdan emin olun. Opak bir pencere arka plan rengi, bulanık alanı gizler.

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

  • Uygulamanızı Android 12 emülatöründe test edin. Bir Android öykünücüsü kurmak için Android öykünücüsü ayarlama konusuna bakın. Emülatörle oluşturduğunuz herhangi bir Android sanal cihazı, pencere bulanıklaştırmasını destekler.

Yuvarlatılmış köşeler yok

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

  • Cihazın pil tasarrufu modunda olup olmadığını veya multimedya tünellemeyi kullanıp kullanmadığını kontrol edin. Bazı TV cihazlarında video oynatma sırasında pencere bulanıklığı da devre dışı bırakılabilir.

Arka plan bulanıklığı tam ekran olarak çizilmiş, pencere sınırları dahilinde değil

Dinleyiciden gelen güncellemeler ekrana uygulanmıyor

  • Dinleyici güncellemeleri eski bir pencere örneğine uygulanıyor olabilir. Pencerenin yok edilip edilmediğini ve doğru dinleyici güncellemesiyle yeniden oluşturulup oluşturulmadığını kontrol edin.