विंडो ब्लर्स

एंड्रॉइड में 12 सार्वजनिक एपीआई विंडो-ब्लर इफेक्ट्स (जैसे बैकग्राउंड ब्लर और ब्लर बैक) को लागू करने के लिए उपलब्ध हैं। ध्यान दें कि यद्यपि आप विंडो ब्लर को कोड, डेवलपर दस्तावेज़ीकरण, या UI नोटेशन में क्रॉस-विंडो ब्लर भी कह सकते हैं, क्रॉस-विंडो ब्लर विंडो ब्लर के समान ही है।

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

बैकग्राउंड ब्लर केवल

1

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

2

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

3

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

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

यह ध्यान रखना महत्वपूर्ण है कि यह सुविधा महत्वपूर्ण GPU संसाधनों का उपयोग करती है। इसलिए यद्यपि यह सभी Android उपकरणों के लिए उपलब्ध है, यह केवल उन उपकरणों पर समर्थित है जिनमें पर्याप्त GPU शक्ति है।

कार्यान्वयन

ओईएम और भागीदार

विंडो ब्लर्स डिफ़ॉल्ट रूप से अक्षम होते हैं। उपकरणों पर ब्लर कार्यक्षमता को सक्षम करने के लिए, निम्न कार्य करें:

  • सुनिश्चित करें कि डिवाइस अतिरिक्त GPU लोड को संभाल सकता है - ब्लर ऑपरेशन महंगा है और निचले-अंत वाले उपकरणों पर, यह गिराए गए फ़्रेम का कारण हो सकता है। इसे केवल पर्याप्त GPU शक्ति वाले उपकरणों पर सक्षम करें।
  • सुनिश्चित करें कि आपका librenderengine धुंधला तर्क को लागू करता है - डिफ़ॉल्ट Android 12 रेंडर इंजन करता है, लेकिन किसी भी कस्टम रेंडर इंजन को धुंधला तर्क स्वयं लागू करना होगा।
  • निम्न सतह फ़्लिंगर sysprop सेट करके धुंधलापन सक्षम करें:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

तृतीय पक्ष डेवलपर्स

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

  1. डिवाइस Android 11 या इससे पहले के वर्शन पर चल रहा है। चूंकि विंडो ब्लर्स केवल Android 12 और उच्चतर डिवाइस पर उपलब्ध हैं, इसलिए ऐप्स को Android 11 और उससे पहले के संस्करण चलाने वाले उपकरणों के लिए फ़ॉलबैक, ब्लरलेस अनुभव विकल्प लागू करना चाहिए।
  2. डिवाइस विंडो ब्लर का समर्थन नहीं करता है क्योंकि वे महंगे हैं, इसलिए निचले-छोर वाले डिवाइस उन्हें रेंडर करते समय फ़्रेम को गिरा सकते हैं। ऐसे मामलों के लिए, ऐप्स को फॉलबैक ब्लरलेस अनुभव प्रदान करना चाहिए।
  3. सिस्टम सर्वर (उदाहरण के लिए, बैटरी सेवर मोड के दौरान, या डेवलपर सेटिंग या टनल मोड के कारण) रनटाइम पर धुंधलापन अक्षम करता है।

ऊपर दिए गए अंक 2 और 3 दोनों को WindowManager.addCrossWindowBlurEnabledListener के साथ पंजीकृत श्रोता द्वारा सूचित किया जाता है। यदि आपके ऐप्स ब्लर एपीआई का उपयोग करते हैं, तो इस श्रोता को पंजीकृत करें और जब भी श्रोता को कॉल किया जाए तो अपना यूआई अपडेट करें, यदि आप ब्लर-सक्षम और ब्लर-अक्षम राज्यों के लिए एक अलग यूआई का उपयोग करना चाहते हैं। जब यह पंजीकृत हो जाता है, तो श्रोता को तुरंत रिपोर्ट करने के लिए बुलाया जाता है कि क्या ब्लर्स वर्तमान में सक्षम हैं।

निम्नलिखित विधियों का उपयोग करके धुंधला कार्यक्षमता को लागू करें:

  • बैकग्राउंड ब्लर: setBackgroundBlurRadius विधि । आपको यह भी सुनिश्चित करना होगा कि खिड़की पारभासी है:

    windowIsTranslucent को true पर सेट करें और पारदर्शी रंग के साथ विंडो बैकग्राउंड बनाने के लिए setBackgroundDrawable का उपयोग करें। (आप विकल्प के रूप में कोनों को गोल भी कर सकते हैं।)

  • पीछे धुंधला: setBlurBehindRadius

  • धुंधला श्रोता प्रविष्टि बिंदु: addCrossWindowBlurEnabledListener

  • सुविधा धुंधला सक्षम गेटटर: isCrossWindowBlurEnabled

उदाहरण और स्रोत

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

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

विंडो ब्लर्स को अनुमति देने और अस्वीकार करने के दो तरीके हैं।

  1. यूआई से:

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

  2. टर्मिनल से (डिवाइस को रूट किया जाना चाहिए):

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

आप विंडो ब्लर कार्यक्षमता को केवल तभी चालू या बंद कर सकते हैं, जब आपके डिवाइस में ब्लर का समर्थन करने की क्षमता हो। (डिवाइस जो विंडो ब्लर का समर्थन नहीं करते हैं, वे सुविधा को सक्षम नहीं कर सकते हैं।) डिफ़ॉल्ट रूप से, ब्लर्स उन उपकरणों पर सक्षम होते हैं जो उनका समर्थन करते हैं।

जब आप अपने उपकरणों के लिए ब्लर सक्षम करते हैं, तो विचार करें कि बैटरी-बचत मोड या मल्टीमीडिया टनलिंग जैसी अन्य चीज़ें उन्हें अक्षम कर सकती हैं। सभी आवश्यक शर्तें पूरी होने पर धुंधलापन सक्षम हो जाता है—वे समर्थित हैं, और कुछ भी उन्हें अक्षम नहीं कर रहा है। यह देखने के लिए कि क्या ब्लर कार्यक्षमता की वर्तमान स्थिति "सक्षम" है, adb shell wm disable-blur कमांड का उपयोग करें।

मान्यकरण

यह सुनिश्चित करने के लिए कि ब्लर सुविधाओं का आपका संस्करण आपके इरादे के अनुसार काम करता है, UI लॉजिक को लागू करें ताकि जब भी ब्लर इनेबल्ड परिवर्तन हो (जैसा कि blurEnabled द्वारा रिपोर्ट किया गया है) UI तत्वों को फिर से addCrossWindowBlurEnabledListener करता है।

  1. वह UI खोलें जिसमें ब्लर है।
  2. UI से या CLI द्वारा विंडो ब्लर को चालू और बंद करने के लिए दिए गए चरणों का उपयोग करें।
  3. सत्यापित करें कि UI उम्मीद के मुताबिक धुंधले से बदल जाता है।

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

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

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

  • सीएलआई का उपयोग करके या सेटिंग्स पर नेविगेट करके सत्यापित करें कि ब्लर्स वर्तमान में सक्षम हैं (और यह कि आपका हार्डवेयर उनका समर्थन करता है)।

    1. adb shell wm disable-blur कमांड का उपयोग करें, जो यह प्रिंट करता है कि क्या उस डिवाइस पर ब्लर्स समर्थित हैं और क्या वे वर्तमान में सक्षम हैं।
    2. सेटिंग्स पर नेविगेट करें -> सिस्टम -> डेवलपर विकल्प -> हार्डवेयर त्वरित प्रतिपादन -> विंडो-स्तरीय ब्लर की अनुमति दें । यदि आपको वहां विकल्प नहीं मिल रहा है, तो आपके डिवाइस पर धुंधलापन समर्थित नहीं है।
  • सुनिश्चित करें कि आपने पारदर्शी विंडो पृष्ठभूमि रंग सेट किया है; एक अपारदर्शी खिड़की पृष्ठभूमि रंग धुंधले क्षेत्र को छुपाता है (कवर करता है)।

टेस्ट डिवाइस विंडो ब्लर का समर्थन नहीं करता

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

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

  • विंडो बैकग्राउंड ड्रॉएबल - Window#setBackgroundDrawable सेट करके गोल कोनों को परिभाषित करें। यह धुंधला क्षेत्र की रूपरेखा निर्धारित करता है।

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

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

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

  • सुनिश्चित करें कि आपकी विंडो फ्लोटिंग के रूप में चिह्नित है - android:windowIsFloating
  • सुनिश्चित करें कि आपने एक विंडो बैकग्राउंड ड्रॉएबल - Window#setBackgroundDrawable सेट किया है। यह धुंधला क्षेत्र की रूपरेखा निर्धारित करता है।

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

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