Android 12 में, विंडो-ब्लर इफ़ेक्ट लागू करने के लिए, सार्वजनिक एपीआई उपलब्ध हैं. जैसे, बैकग्राउंड धुंधला करना और पीछे का हिस्सा धुंधला करना.
विंडो ब्लर या क्रॉस-विंडो ब्लर का इस्तेमाल, दी गई विंडो के पीछे की स्क्रीन को धुंधला करने के लिए किया जाता है. विंडो ब्लर दो तरह के होते हैं. इनका इस्तेमाल अलग-अलग विज़ुअल इफ़ेक्ट पाने के लिए किया जा सकता है:
बैकग्राउंड धुंधला करने की सुविधा से, धुंधले बैकग्राउंड वाली विंडो बनाई जा सकती हैं. इससे फ़्रॉस्टेड ग्लास इफ़ेक्ट मिलता है.
पीछे का हिस्सा धुंधला करने की सुविधा से, (डायलॉग) विंडो के पीछे की पूरी स्क्रीन को धुंधला किया जा सकता है. इससे डेप्थ ऑफ़ फ़ील्ड इफ़ेक्ट मिलता है.
इन दोनों इफ़ेक्ट का इस्तेमाल अलग-अलग या एक साथ किया जा सकता है. जैसा कि यहां दी गई इमेज में दिखाया गया है:
a |
b |
![]() c |
पहली इमेज. सिर्फ़ बैकग्राउंड धुंधला करना (a), सिर्फ़ पीछे का हिस्सा धुंधला करना (b), बैकग्राउंड धुंधला करना और पीछे का हिस्सा धुंधला करना (c)
विंडो ब्लर की सुविधा, सभी विंडो पर काम करती है. इसका मतलब है कि यह सुविधा तब भी काम करती है, जब आपकी विंडो के पीछे कोई दूसरा ऐप्लिकेशन खुला हो. यह इफ़ेक्ट, ब्लर रेंडर इफ़ेक्ट जैसा नहीं है. ब्लर रेंडर इफ़ेक्ट, एक ही विंडो में मौजूद कॉन्टेंट को अंदर से धुंधला करता है. विंडो ब्लर, डायलॉग, बॉटम शीट, और अन्य फ़्लोटिंग विंडो के लिए काम का है.
देखें.लागू करना
ऐप्लिकेशन डेवलपर
ब्लर इफ़ेक्ट बनाने के लिए, ऐप्लिकेशन डेवलपर को ब्लर रेडियस देना होगा. ब्लर रेडियस से यह तय होता है कि ब्लर कितना घना होगा. इसका मतलब है कि रेडियस जितना ज़्यादा होगा, ब्लर उतना ही घना होगा. 0 पिक्सल का ब्लर मतलब कोई ब्लर नहीं. पीछे का हिस्सा धुंधला करने के लिए, 20 पिक्सल का रेडियस, डेप्थ ऑफ़ फ़ील्ड इफ़ेक्ट देता है. वहीं, बैकग्राउंड धुंधला करने के लिए, 80 पिक्सल का रेडियस, फ़्रॉस्टेड ग्लास इफ़ेक्ट देता है. 150 पिक्सल से ज़्यादा के ब्लर रेडियस का इस्तेमाल न करें, क्योंकि इससे परफ़ॉर्मेंस पर काफ़ी असर पड़ेगा.
अपनी पसंद का ब्लर इफ़ेक्ट पाने और कॉन्टेंट को आसानी से पढ़ने के लिए, ब्लर रेडियस की ऐसी वैल्यू चुनें जिसके साथ, रंग की पारभासी लेयर भी हो.
बैकग्राउंड धुंधला करना
फ़्लोटिंग विंडो पर बैकग्राउंड धुंधला करने की सुविधा का इस्तेमाल करके, विंडो बैकग्राउंड इफ़ेक्ट बनाएं. यह इफ़ेक्ट, नीचे मौजूद कॉन्टेंट की धुंधली इमेज होती है. अपनी विंडो के लिए धुंधला बैकग्राउंड जोड़ने के लिए, यह तरीका अपनाएं:
बैकग्राउंड धुंधला करने का रेडियस सेट करने के लिए, Window#setBackgroundBlurRadius(int) को कॉल करें. या, विंडो थीम में, R.attr.windowBackgroundBlurRadius सेट करें.
विंडो को पारभासी बनाने के लिए, R.attr.windowIsTranslucent को 'सही' पर सेट करें. ब्लर, विंडो की सतह के नीचे बनाया जाता है. इसलिए, ब्लर को दिखाने के लिए, विंडो को पारभासी बनाना ज़रूरी है.
ज़रूरत पड़ने पर, पारभासी रंग वाले रेक्टैंगुलर विंडो बैकग्राउंड ड्रॉएबल को जोड़ने के लिए, Window#setBackgroundDrawableResource(int) को कॉल करें. या, विंडो थीम में, R.attr.windowBackground सेट करें.
गोल कोनों वाली विंडो के लिए, धुंधले किए गए एरिया के गोल कोनों को तय करें. इसके लिए, विंडो बैकग्राउंड ड्रॉएबल के तौर पर, गोल कोनों वाले ShapeDrawable को सेट करें.
ब्लर की सुविधा चालू और बंद होने की स्थितियों को मैनेज करें. ज़्यादा जानकारी के लिए, ऐप्लिकेशन में विंडो ब्लर का इस्तेमाल करने के दिशा-निर्देश सेक्शन देखें.
पीछे का हिस्सा धुंधला करना
पीछे का हिस्सा धुंधला करने की सुविधा से, विंडो के पीछे की पूरी स्क्रीन धुंधली हो जाती है. इस इफ़ेक्ट का इस्तेमाल, विंडो के पीछे की स्क्रीन पर मौजूद किसी भी चीज़ को धुंधला करके, उपयोगकर्ता का ध्यान विंडो के कॉन्टेंट पर लाने के लिए किया जाता है.
अपनी विंडो के पीछे मौजूद कॉन्टेंट को धुंधला करने के लिए, यह तरीका अपनाएं:
पीछे का हिस्सा धुंधला करने की सुविधा चालू करने के लिए, विंडो फ़्लैग में
FLAG_BLUR_BEHINDजोड़ें. या, विंडो थीम में, सेट करें R.attr.windowBlurBehindEnabled.पीछे का हिस्सा धुंधला करने का रेडियस सेट करने के लिए,
WindowManager.LayoutParams#setBlurBehindRadiusको कॉल करें. या, विंडो थीम में, सेट करें R.attr.windowBlurBehindRadius.ज़रूरत पड़ने पर, धुंधला करने की ऐसी वैल्यू चुनें जो इफ़ेक्ट को बेहतर बनाए.
ब्लर की सुविधा चालू और बंद होने की स्थितियों को मैनेज करें. ज़्यादा जानकारी के लिए, ऐप्लिकेशन में विंडो ब्लर का इस्तेमाल करने के दिशा-निर्देश सेक्शन देखें.
ऐप्लिकेशन में विंडो ब्लर का इस्तेमाल करने के दिशा-निर्देश
विंडो ब्लर की सुविधा, इन चीज़ों पर निर्भर करती है:
Android वर्शन: विंडो ब्लर के एपीआई, सिर्फ़ Android 12 और इसके बाद के वर्शन पर उपलब्ध हैं. Android वर्शन के लिए, डिवाइस का एसडीके टूल देखें.
ग्राफ़िक्स परफ़ॉर्मेंस: कम परफ़ॉर्मेंस वाले जीपीयू वाले डिवाइसों पर, विंडो ब्लर की सुविधा उपलब्ध नहीं हो सकती है.
सिस्टम की स्थिति: सिस्टम सर्वर, रनटाइम के दौरान विंडो ब्लर की सुविधा को अस्थायी तौर पर बंद कर सकता है. जैसे, बैटरी सेवर मोड के दौरान, कुछ तरह का वीडियो कॉन्टेंट चलाने के दौरान या डेवलपर के ओवरराइड की वजह से.
अपने ऐप्लिकेशन को Android के सभी वर्शन, डिवाइसों, और सिस्टम की स्थितियों के साथ काम करने लायक बनाने के लिए, इन दिशा-निर्देशों का पालन करें:
WindowManager#addCrossWindowBlurEnabledListener के ज़रिए एक लिसनर जोड़ें, ताकि विंडो ब्लर की सुविधा चालू या बंद होने पर आपको सूचना मिल सके. इसके अलावा, यह क्वेरी करने के लिए
WindowManager#isCrossWindowBlurEnabledका इस्तेमाल करें कि फ़िलहाल, विंडो ब्लर की सुविधा चालू है या नहीं.विंडो बैकग्राउंड के लिए दो वर्शन लागू करें, ताकि विंडो ब्लर की सुविधा चालू या बंद होने की स्थिति को मैनेज किया जा सके.
ब्लर की सुविधा चालू होने पर, विंडो बैकग्राउंड पारभासी होना चाहिए, ताकि ब्लर दिख सके. इस स्थिति में, जब ब्लर की सुविधा बंद हो जाती है, तो विंडो का कॉन्टेंट, नीचे मौजूद विंडो के कॉन्टेंट पर सीधे तौर पर ओवरलैप हो जाता है. इससे ओवरलैप होने वाली विंडो को पढ़ना मुश्किल हो जाता है. इस तरह के इफ़ेक्ट से बचने के लिए, जब विंडो ब्लर की सुविधा बंद हो, तो ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को इस तरह अडजस्ट करें:
बैकग्राउंड धुंधला करने के लिए, विंडो बैकग्राउंड ड्रॉएबल का अल्फ़ा बढ़ाएं, ताकि यह ज़्यादा अपारदर्शी हो जाए.
पीछे का हिस्सा धुंधला करने के लिए, धुंधला करने की ज़्यादा वैल्यू वाली डिम लेयर जोड़ें.
पीछे का हिस्सा धुंधला करने और बैकग्राउंड धुंधला करने की सुविधा का उदाहरण
इस सेक्शन में, ऐसी गतिविधि का एक उदाहरण दिया गया है जिसमें पीछे का हिस्सा धुंधला करने और बैकग्राउंड धुंधला करने, दोनों सुविधाओं का इस्तेमाल किया गया है.
MainActivity.java का यह उदाहरण, 20 पिक्सल के ब्लर रेडियस और 80 पिक्सल के बैकग्राउंड ब्लर रेडियस वाला एक डायलॉग है. इसमें गोल कोने हैं. इन्हें विंडो बैकग्राउंड ड्रॉएबल में, एक्सएमएल में तय किया गया है. यह अलग-अलग Android वर्शन, अलग-अलग डिवाइसों (जिन पर विंडो ब्लर की सुविधा उपलब्ध नहीं हो सकती) और रनटाइम के दौरान, ब्लर की सुविधा चालू या बंद होने पर होने वाले बदलावों को सही तरीके से मैनेज करता है. यह पक्का करता है कि इन सभी स्थितियों में, डायलॉग का कॉन्टेंट पढ़ा जा सके. इसके लिए, विंडो बैकग्राउंड ड्रॉएबल के अल्फ़ा और विंडो डिम की वैल्यू को अडजस्ट किया जाता है.
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 में, ShapeDrawable के तौर पर तय करते हैं, जिसमें गोल कोने
20 dp के रेडियस वाले होते हैं. जैसे:
<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>
ओईएम और पार्टनर
किसी डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध कराने के लिए, ओईएम को यह एलान करना होगा कि डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध है.
यह देखने के लिए कि आपके डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध है या नहीं, यह तरीका अपनाएं:
पक्का करें कि डिवाइस, जीपीयू के अतिरिक्त लोड को मैनेज कर सकता हो. कम परफ़ॉर्मेंस वाले डिवाइस, अतिरिक्त लोड को मैनेज नहीं कर पाते. इससे फ़्रेम ड्रॉप हो सकते हैं. सिर्फ़ टेस्ट किए गए ऐसे डिवाइसों पर विंडो ब्लर की सुविधा चालू करें जिनमें जीपीयू की पावर काफ़ी हो.
अगर आपके पास रेंडर इंजन को पसंद के मुताबिक बनाने की सुविधा है, तो पक्का करें कि आपका रेंडर इंजन, धुंधला करने की लॉजिक को लागू करता हो. डिफ़ॉल्ट Android 12 रेंडर इंजन धुंधला करने की लॉजिक को
BlurFilter.cppमें लागू करता है.
यह पक्का करने के बाद कि आपके डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध है, सर्फ़ेस फ़्लिंगर का यह sysprop सेट करें:
PRODUCT_VENDOR_PROPERTIES += \
ro.surface_flinger.supports_background_blur=1
सत्यापन
यह पुष्टि करने के लिए कि ब्लर की सुविधा चालू और बंद होने की स्थितियों के बीच स्विच करने पर, आपके ऐप्लिकेशन की विंडो सही तरीके से काम करती है या नहीं, यह तरीका अपनाएं:
वह यूज़र इंटरफ़ेस (यूआई) खोलें जिसमें ब्लर की सुविधा उपलब्ध है.
विंडो ब्लर की सुविधा को चालू और बंद करके, विंडो ब्लर की सुविधा को चालू या बंद करें.
पुष्टि करें कि विंडो यूआई, उम्मीद के मुताबिक धुंधली स्थिति में बदलता है और वापस आता है.
विंडो ब्लर की सुविधा को चालू और बंद करना
यह टेस्ट करने के लिए कि विंडो ब्लर इफ़ेक्ट के साथ, विंडो यूआई कैसे रेंडर होता है, इनमें से किसी एक तरीके का इस्तेमाल करके, ब्लर की सुविधा को चालू या बंद करें:
डेवलपर के लिए सेटिंग और टूल से:
सेटिंग - > सिस्टम -> डेवलपर के लिए सेटिंग और टूल -> हार्डवेयर से तेज़ी लाने की सुविधा से रेंडर करना -> विंडो-लेवल ब्लर की अनुमति दें
रूट किए गए डिवाइस पर, टर्मिनल से:
adb shell wm disable-blur 1 # 1 disables window blurs, 0 allows them
यह देखने के लिए कि आपके Android 12 या इसके बाद के वर्शन वाले डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध है या नहीं और फ़िलहाल, विंडो ब्लर की सुविधा चालू है या नहीं, रूट किए गए डिवाइस पर adb shell wm disable-blur चलाएं.
समस्या का हल
सत्यापन के दौरान आने वाली समस्याओं को हल करने के लिए, इसे गाइड के तौर पर इस्तेमाल करें.
ब्लर नहीं दिख रहा है
पुष्टि करें कि फ़िलहाल, ब्लर की सुविधा चालू है और आपका हार्डवेयर इसे सपोर्ट करता है. विंडो ब्लर की सुविधा को चालू और बंद करना देखें.
पक्का करें कि आपने विंडो बैकग्राउंड का पारभासी रंग सेट किया हो. विंडो बैकग्राउंड का अपारदर्शी रंग, धुंधले किए गए एरिया को छिपा देता है.
टेस्ट के लिए डिवाइस पर विंडो ब्लर की सुविधा उपलब्ध नहीं है
- अपने ऐप्लिकेशन को Android 12 एम्युलेटर पर टेस्ट करें. Android एम्युलेटर सेट अप करने के लिए, Android एम्युलेटर सेट अप करना देखें. एम्युलेटर से बनाया गया कोई भी Android वर्चुअल डिवाइस, विंडो ब्लर की सुविधा को सपोर्ट करता है.
गोल कोने नहीं दिख रहे हैं
- गोल कोने तय करने के लिए, विंडो बैकग्राउंड ड्रॉएबल सेट करें. यह ड्रॉएबल, धुंधले किए गए एरिया की आउटलाइन तय करता है.
डेवलपर के लिए सेटिंग और टूल को अपडेट करने पर भी, ब्लर की सुविधा चालू नहीं होती
- देखें कि डिवाइस बैटरी सेवर मोड में है या नहीं या यह मल्टीमीडिया टनलिंग का इस्तेमाल कर रहा है या नहीं. कुछ टीवी डिवाइसों पर, वीडियो चलाने के दौरान भी विंडो ब्लर की सुविधा बंद हो सकती है.
बैकग्राउंड धुंधला करने की सुविधा, विंडो की सीमाओं के अंदर नहीं, बल्कि पूरी स्क्रीन पर काम कर रही है
यह पक्का करने के लिए कि आपकी विंडो को फ़्लोटिंग के तौर पर मार्क किया गया है, android:windowIsFloating देखें.
पक्का करें कि विंडो बैकग्राउंड ड्रॉएबल सेट किया गया हो. यह सेटिंग, धुंधले किए गए एरिया की आउटलाइन तय करती है.
लिसनर से मिले अपडेट, स्क्रीन पर लागू नहीं हो रहे हैं
- हो सकता है कि लिसनर के अपडेट, पुरानी विंडो इंस्टेंस पर लागू हो रहे हों. देखें कि विंडो डिस्ट्रॉय हो रही है और सही लिसनर अपडेट के साथ फिर से बनाई जा रही है या नहीं.
