खिड़की धुंधली

एंड्रॉइड 12 में, विंडो-ब्लर प्रभावों को लागू करने के लिए सार्वजनिक एपीआई उपलब्ध हैं, जैसे बैकग्राउंड ब्लर और ब्लर बैक।

विंडो ब्लर या क्रॉस-विंडो ब्लर का उपयोग दी गई विंडो के पीछे की स्क्रीन को धुंधला करने के लिए किया जाता है। विंडो ब्लर दो प्रकार के होते हैं, जिनका उपयोग विभिन्न दृश्य प्रभावों को प्राप्त करने के लिए किया जा सकता है:

  • पृष्ठभूमि धुंधलापन आपको धुंधली पृष्ठभूमि वाली विंडो बनाने की अनुमति देता है, जिससे फ्रॉस्टेड ग्लास प्रभाव पैदा होता है।

  • ब्लर बिहाइंड आपको (डायलॉग) विंडो के पीछे पूरी स्क्रीन को धुंधला करने की अनुमति देता है, जिससे क्षेत्र की गहराई का प्रभाव पैदा होता है।

दोनों प्रभावों को अलग-अलग या संयुक्त रूप से उपयोग किया जा सकता है, जैसा कि निम्नलिखित चित्र में दिखाया गया है:

केवल पृष्ठभूमि धुंधला

केवल पीछे धुंधला

बी

पीछे धुंधला और पृष्ठभूमि धुंधला

सी

चित्र 1. केवल पृष्ठभूमि धुंधला (ए), केवल पीछे धुंधला (बी), पृष्ठभूमि धुंधला और पीछे धुंधला (सी)

विंडो ब्लर फीचर सभी विंडोज़ पर काम करता है, जिसका अर्थ है कि यह तब भी काम करता है जब आपकी विंडो के पीछे कोई अन्य ऐप हो। यह प्रभाव ब्लर रेंडर प्रभाव के समान नहीं है, जो एक ही विंडो के अंदर की सामग्री को धुंधला कर देता है। विंडो ब्लर संवाद, बॉटम शीट और अन्य फ्लोटिंग विंडो के लिए उपयोगी होते हैं।

कार्यान्वयन

ऐप डेवलपर्स

धुंधला प्रभाव पैदा करने के लिए ऐप डेवलपर्स को धुंधला त्रिज्या प्रदान करना होगा। धुंधला त्रिज्या नियंत्रित करता है कि धुंधलापन कितना घना है, यानी त्रिज्या जितनी अधिक होगी, धुंधलापन उतना ही सघन होगा। 0 px के धुंधलेपन का मतलब कोई धुंधलापन नहीं है। पीछे के धुंधलापन के लिए, 20 px का त्रिज्या क्षेत्र प्रभाव की एक अच्छी गहराई बनाता है, जबकि 80 px का पृष्ठभूमि धुंधला त्रिज्या एक अच्छा फ्रॉस्टेड ग्लास प्रभाव बनाता है। 150 पीएक्स से अधिक धुंधला त्रिज्या से बचें, क्योंकि इससे प्रदर्शन पर महत्वपूर्ण प्रभाव पड़ेगा।

वांछित धुंधला प्रभाव प्राप्त करने और पठनीयता बढ़ाने के लिए, रंग की पारभासी परत के साथ पूरक धुंधला त्रिज्या मान चुनें।

पृष्ठभूमि धुंधला

विंडो पृष्ठभूमि प्रभाव बनाने के लिए फ़्लोटिंग विंडोज़ पर पृष्ठभूमि धुंधला का उपयोग करें जो अंतर्निहित सामग्री की धुंधली छवि है। अपनी विंडो में धुंधली पृष्ठभूमि जोड़ने के लिए, निम्न कार्य करें:

  1. बैकग्राउंड ब्लर रेडियस सेट करने के लिए window#setBackgroundBlurRadius(int) पर कॉल करें। या, विंडो थीम में, R.attr.windowBackgroundBlurRadius सेट करें।

  2. विंडो को पारभासी बनाने के लिए R.attr.windowIsTranslucent को सत्य पर सेट करें। धुंधलापन खिड़की की सतह के नीचे खींचा जाता है, इसलिए धुंधला दिखाई देने के लिए खिड़की को पारभासी होना चाहिए।

  3. वैकल्पिक रूप से, पारभासी रंग के साथ खींचने योग्य आयताकार विंडो पृष्ठभूमि जोड़ने के लिए window#setBackgroundDrawableResource(int) पर कॉल करें। या, विंडो थीम में, R.attr.windowBackground सेट करें।

  4. गोलाकार कोनों वाली विंडो के लिए, खिड़की की पृष्ठभूमि को खींचने योग्य के रूप में गोलाकार कोनों के साथ शेपड्राएबल सेट करके धुंधले क्षेत्र के लिए गोलाकार कोनों को निर्धारित करें।

  5. धुंधला सक्षम और अक्षम स्थितियों को संभालें। अधिक जानकारी के लिए ऐप्स अनुभाग में विंडो ब्लर का उपयोग करने के लिए दिशानिर्देश देखें।

पीछे धुंधला

पीछे का धुंधलापन खिड़की के पीछे की पूरी स्क्रीन को धुंधला कर देता है। इस प्रभाव का उपयोग विंडो के पीछे स्क्रीन पर किसी भी चीज़ को धुंधला करके उपयोगकर्ता का ध्यान विंडो सामग्री की ओर निर्देशित करने के लिए किया जाता है।

अपनी विंडो के पीछे की सामग्री को धुंधला करने के लिए, इन चरणों का पालन करें:

  1. पीछे धुंधलापन सक्षम करने के लिए, विंडो फ़्लैग में FLAG_BLUR_BEHIND जोड़ें। या, विंडो थीम में, R.attr.windowBlurBehindEnabled सेट करें।

  2. त्रिज्या के पीछे धुंधलापन सेट करने के लिए WindowManager.LayoutParams#setBlurBehindRadius पर कॉल करें। या, विंडो थीम में, R.attr.windowBlurBehindRadius सेट करें।

  3. वैकल्पिक रूप से, एक पूरक मंद राशि चुनें।

  4. धुंधला सक्षम और अक्षम स्थितियों को संभालें। अधिक जानकारी के लिए ऐप्स अनुभाग में विंडो ब्लर का उपयोग करने के लिए दिशानिर्देश देखें।

ऐप्स में विंडो ब्लर का उपयोग करने के लिए दिशानिर्देश

विंडोज़ ब्लर के लिए समर्थन निम्नलिखित पर निर्भर है:

  • Android संस्करण: विंडोज़ ब्लर एपीआई केवल Android 12 और उच्चतर पर उपलब्ध हैं। Android संस्करण के लिए डिवाइस SDK की जाँच करें।

  • ग्राफिक्स प्रदर्शन: कम प्रदर्शन वाले जीपीयू वाले उपकरण विंडो ब्लर का समर्थन नहीं करने का विकल्प चुन सकते हैं।

  • सिस्टम स्थिति: सिस्टम सर्वर रनटाइम पर विंडो ब्लर को अस्थायी रूप से अक्षम कर सकता है, उदाहरण के लिए, बैटरी सेविंग मोड के दौरान, कुछ प्रकार की वीडियो सामग्री चलाते समय या डेवलपर ओवरराइड के कारण।

अपने ऐप को सभी Android संस्करणों, डिवाइसों और सिस्टम स्थितियों के अनुकूल बनाने के लिए, इन दिशानिर्देशों का पालन करें:

  • विंडो ब्लर सक्षम या अक्षम होने पर आपको सूचित करने के लिए, windowManager#addCrossWindowBlurEnabledListener के माध्यम से एक श्रोता जोड़ें। इसके अतिरिक्त, यह पूछने के लिए कि विंडो ब्लर वर्तमान में सक्षम हैं या नहीं, WindowManager#isCrossWindowBlurEnabled का उपयोग करें।

  • विंडो ब्लर्स की सक्षम या अक्षम स्थिति को समायोजित करने के लिए, विंडो पृष्ठभूमि के लिए दो संस्करण लागू करें।

    जब धुंधलापन सक्षम किया जाता है, तो धुंधलापन दृश्यमान बनाने के लिए विंडो पृष्ठभूमि पारभासी होनी चाहिए। इस स्थिति में, जब धुंधलापन अक्षम हो जाता है, तो विंडो सामग्री सीधे अंतर्निहित विंडो की सामग्री के साथ ओवरलैप हो जाती है, जिससे ओवरलैपिंग विंडो कम सुपाठ्य हो जाती है। इस तरह के प्रभाव से बचने के लिए, जब विंडो ब्लर अक्षम हो, तो ऐप के यूआई को निम्नानुसार अनुकूलित करें:

    • पृष्ठभूमि को धुंधला करने के लिए, विंडो पृष्ठभूमि को खींचने योग्य अल्फा को बढ़ाएं, जिससे यह अधिक अपारदर्शी हो जाए।

    • पीछे धुंधलापन के लिए, अधिक मंद मात्रा वाली एक मंद परत जोड़ें।

पीछे धुंधलापन और पृष्ठभूमि धुंधलापन का उदाहरण

यह अनुभाग एक ऐसी गतिविधि का कार्यशील उदाहरण प्रदान करता है जो पीछे धुंधलापन और पृष्ठभूमि धुंधलापन दोनों का उपयोग करता है।

MainActivity.java का निम्नलिखित उदाहरण 20 px की त्रिज्या के पीछे धुंधलापन और 80 px की पृष्ठभूमि धुंधली त्रिज्या वाला एक संवाद है। इसमें गोल कोने हैं, जो विंडो पृष्ठभूमि में खींचने योग्य xml में परिभाषित हैं। यह विभिन्न एंड्रॉइड संस्करणों, विभिन्न डिवाइसों (जो संभावित रूप से विंडो ब्लर का समर्थन नहीं करते हैं) और रनटाइम ब्लर सक्षम या अक्षम परिवर्तनों को सही ढंग से संभालता है। यह सुनिश्चित करता है कि विंडो पृष्ठभूमि ड्रॉएबल अल्फा और विंडो डिम राशि को समायोजित करके संवाद सामग्री इनमें से किसी भी स्थिति में पढ़ने योग्य है।

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

विंडो के लिए गोल कोने बनाने के लिए, हम विंडो बैकग्राउंड को res/drawable/window_background.xml में एक शेपड्रॉएबल के रूप में परिभाषित करते हैं, जिसमें त्रिज्या 20 डीपी के साथ गोल कोने होते हैं:

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

विंडो धुंधला होने से गतिविधि के नीचे विंडो की सामग्री धुंधली हो जाती है। इस गतिविधि विंडो के नीचे धुंधली छवि खींची जाती है, इसलिए धुंधलापन दिखाई देने के लिए गतिविधि विंडो को पारदर्शी होना आवश्यक है। विंडो को पारदर्शी बनाने के लिए हम गतिविधि थीम में R.attr.windowIsTranslucent को निम्नानुसार सेट करते हैं:

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

OEM और भागीदार

किसी डिवाइस पर विंडो ब्लर करने के लिए, OEM को यह घोषित करना होगा कि डिवाइस विंडो ब्लर का समर्थन करता है।

यह जाँचने के लिए कि क्या आपका उपकरण विंडो ब्लर का समर्थन कर सकता है, निम्न कार्य करें:

  • सुनिश्चित करें कि डिवाइस अतिरिक्त GPU लोड को संभाल सकता है। निचले स्तर के उपकरण अतिरिक्त भार को संभालने में सक्षम नहीं हो सकते हैं, जिससे फ़्रेम गिर सकते हैं। केवल पर्याप्त GPU पावर वाले परीक्षण किए गए उपकरणों पर विंडो ब्लर सक्षम करें।

  • यदि आपके पास एक अनुकूलित रेंडर इंजन है, तो सुनिश्चित करें कि आपका रेंडर इंजन धुंधला तर्क लागू करता है। डिफ़ॉल्ट Android 12 रेंडर इंजन BlurFilter.cpp में धुंधला तर्क लागू करता है।

एक बार जब आप सुनिश्चित कर लें कि आपका उपकरण विंडो ब्लर का समर्थन कर सकता है, तो निम्न सतह फ़्लिंगर sysprop सेट करें:

PRODUCT_VENDOR_PROPERTIES += \
       ro.surface_flinger.supports_background_blur=1

मान्यकरण

यह सत्यापित करने के लिए कि ब्लर सक्षम और ब्लर अक्षम स्थितियों के बीच स्विच करते समय आपकी ऐप विंडो में उचित हैंडलिंग है, इन चरणों का पालन करें:

  1. वह यूआई खोलें जिसमें धुंधलापन है।

  2. विंडो ब्लर को चालू और बंद करके विंडो ब्लर को सक्षम या अक्षम करें।

  3. सत्यापित करें कि विंडो यूआई अपेक्षा के अनुरूप धुंधली स्थिति में बदल जाती है।

विंडो ब्लर को चालू और बंद करें

यह जांचने के लिए कि विंडो यूआई विंडो ब्लर प्रभाव के साथ कैसे प्रस्तुत होता है, निम्न विधियों में से किसी एक का उपयोग करके ब्लर को सक्षम या अक्षम करें:

  • डेवलपर विकल्पों से:

    सेटिंग्स -> सिस्टम -> डेवलपर विकल्प -> हार्डवेयर त्वरित रेंडरिंग -> विंडो-स्तरीय ब्लर की अनुमति दें

  • रूट किए गए डिवाइस पर टर्मिनल से:

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

यह जांचने के लिए कि क्या आपका एंड्रॉइड 12+ डिवाइस विंडो ब्लर का समर्थन करता है और क्या विंडो ब्लर वर्तमान में सक्षम है, रूट किए गए डिवाइस पर adb shell wm disable-blur चलाएं।

समस्या निवारण

सत्यापन के दौरान समस्या निवारण के लिए एक मार्गदर्शिका के रूप में निम्नलिखित का उपयोग करें।

कोई धुंधलापन नहीं खींचा गया

  • सत्यापित करें कि ब्लर्स वर्तमान में सक्षम हैं और आपका हार्डवेयर उनका समर्थन करता है। विंडो ब्लर चालू और बंद करें का संदर्भ लें।

  • सुनिश्चित करें कि आपने पारदर्शी विंडो पृष्ठभूमि रंग सेट किया है। एक अपारदर्शी विंडो पृष्ठभूमि रंग धुंधले क्षेत्र को छुपाता है।

परीक्षण उपकरण विंडो ब्लर का समर्थन नहीं करता

  • एंड्रॉइड 12 एमुलेटर पर अपने एप्लिकेशन का परीक्षण करें। एंड्रॉइड एमुलेटर सेट करने के लिए, एंड्रॉइड एमुलेटर सेट अप करें देखें। एम्यूलेटर के साथ आपके द्वारा बनाया गया कोई भी एंड्रॉइड वर्चुअल डिवाइस विंडो ब्लर का समर्थन करता है।

कोई गोलाकार कोने नहीं

डेवलपर विकल्प को अपडेट करने से धुंधलापन सक्षम नहीं होता है

  • जांचें कि क्या डिवाइस बैटरी-सेविंग मोड में है या क्या यह मल्टीमीडिया टनलिंग का उपयोग कर रहा है। कुछ टीवी उपकरणों पर वीडियो प्लेबैक के दौरान विंडो ब्लर को भी अक्षम किया जा सकता है।

पृष्ठभूमि धुंधला पूर्णस्क्रीन खींचा गया, विंडो सीमा के भीतर नहीं

  • यह सुनिश्चित करने के लिए कि आपकी विंडो फ़्लोटिंग के रूप में चिह्नित है, android:windowIsFloating जांचें।

  • सुनिश्चित करें कि एक विंडो पृष्ठभूमि खींचने योग्य सेट है। यह सेटिंग धुंधले क्षेत्र की रूपरेखा निर्धारित करती है.

श्रोता के अपडेट स्क्रीन पर लागू नहीं होते हैं

  • श्रोता अपडेट किसी पुराने विंडो इंस्टेंस पर लागू हो सकते हैं। जांचें कि क्या विंडो नष्ट हो रही है और सही श्रोता अद्यतन के साथ पुनः निर्मित हो रही है।