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
में धुंधला करने का लॉजिक लागू करता है.
यह पक्का करने के बाद कि आपके डिवाइस पर विंडो ब्लर की सुविधा काम करती है, नीचे दिए गए surface flinger sysprop
को सेट करें:
PRODUCT_VENDOR_PROPERTIES += \
ro.surface_flinger.supports_background_blur=1
Validation
यह पुष्टि करने के लिए कि ऐप्लिकेशन की विंडो, ब्लर करने की सुविधा चालू और बंद करने के बीच स्विच करते समय ठीक से काम करती है, यह तरीका अपनाएं:
वह यूज़र इंटरफ़ेस खोलें जिसमें धुंधला करने की सुविधा है.
विंडो ब्लर करने की सुविधा को चालू और बंद करके, विंडो ब्लर करने की सुविधा को चालू या बंद करें.
पुष्टि करें कि विंडो का यूज़र इंटरफ़ेस (यूआई), धुंधली स्थिति में बदल रहा है या नहीं.
विंडो को धुंधला करने की सुविधा चालू और बंद करना
यह जांच करने के लिए कि विंडो ब्लर इफ़ेक्ट के साथ विंडो यूज़र इंटरफ़ेस (यूआई) कैसे रेंडर होता है, ब्लर इफ़ेक्ट को चालू या बंद करें. इसके लिए, इनमें से कोई एक तरीका अपनाएं:
डेवलपर के लिए सेटिंग और टूल में जाकर:
Settings -> System -> Developer options -> Hardware accelerated rendering -> Allow window-level blurs
रूट किए गए डिवाइस पर टर्मिनल से:
adb shell wm disable-blur 1 # 1 disables window blurs, 0 allows them
यह देखने के लिए कि आपके Android 12 या इसके बाद के वर्शन वाले डिवाइस पर विंडो ब्लर करने की सुविधा काम करती है या नहीं और फ़िलहाल यह सुविधा चालू है या नहीं, रूट किए गए डिवाइस पर adb shell wm disable-blur
चलाएं.
समस्या का हल
पुष्टि के दौरान आने वाली समस्याओं को हल करने के लिए, यहां दी गई जानकारी का इस्तेमाल करें.
कोई धुंधलापन नहीं है
पुष्टि करें कि धुंधला करने की सुविधा चालू है और आपका हार्डवेयर इसे सपोर्ट करता है. विंडो के बैकग्राउंड को धुंधला करने की सुविधा चालू और बंद करना लेख पढ़ें.
पक्का करें कि आपने विंडो के बैकग्राउंड के लिए, हल्का रंग सेट किया हो. अपारदर्शी विंडो के बैकग्राउंड का रंग, धुंधले किए गए हिस्से को छिपा देता है.
टेस्ट डिवाइस पर विंडो ब्लर करने की सुविधा काम नहीं करती
- Android 12 एम्युलेटर पर अपने ऐप्लिकेशन की जांच करें. Android Emulator सेट अप करने के लिए, Android Emulator सेट अप करना लेख पढ़ें. एम्युलेटर की मदद से बनाया गया कोई भी Android वर्चुअल डिवाइस, विंडो ब्लर करने की सुविधा के साथ काम करता है.
गोल कोने नहीं होने चाहिए
- गोल कोनों को तय करने के लिए, विंडो के बैकग्राउंड में दिखने वाली इमेज सेट करें. यह ड्रॉएबल, धुंधली की गई जगह की आउटलाइन तय करता है.
डेवलपर के लिए सेटिंग और टूल को अपडेट करने से, धुंधला करने की सुविधा चालू नहीं होती
- देखें कि डिवाइस बैटरी सेवर मोड में तो नहीं है या वह मल्टीमीडिया टनलिंग का इस्तेमाल तो नहीं कर रहा है. कुछ टीवी डिवाइसों पर, वीडियो चलाने के दौरान विंडो ब्लर करने की सुविधा भी बंद हो सकती है.
बैकग्राउंड को धुंधला करने की सुविधा, विंडो की सीमाओं के अंदर नहीं, बल्कि पूरी स्क्रीन पर लागू होती है
android:windowIsFloating की जांच करें, ताकि यह पक्का किया जा सके कि आपकी विंडो को फ़्लोटिंग के तौर पर मार्क किया गया है.
पक्का करें कि विंडो बैकग्राउंड ड्रॉएबल सेट हो. इस सेटिंग से, धुंधली की गई जगह की आउटलाइन तय होती है.
उपयोगकर्ता की ओर से किए गए अपडेट, स्क्रीन पर लागू नहीं होते
- ऐसा हो सकता है कि लिसनर अपडेट, पुरानी विंडो के इंस्टेंस पर लागू हो रहे हों. देखें कि क्या विंडो बंद हो रही है और सही लिसनर अपडेट के साथ फिर से बनाई जा रही है.