জানালা ঝাপসা

অ্যান্ড্রয়েড ১২-এ উইন্ডো-ব্লার ইফেক্ট, যেমন ব্যাকগ্রাউন্ড ব্লার এবং ব্লার বিহাইন্ড, প্রয়োগ করার জন্য পাবলিক এপিআই উপলব্ধ রয়েছে।

উইন্ডো ব্লার বা ক্রস-উইন্ডো ব্লার ব্যবহার করা হয় নির্দিষ্ট উইন্ডোর পেছনের স্ক্রিনকে ঝাপসা করার জন্য। দুই ধরনের উইন্ডো ব্লার রয়েছে, যা দিয়ে বিভিন্ন ধরনের ভিজ্যুয়াল ইফেক্ট তৈরি করা যায়:

  • ব্যাকগ্রাউন্ড ব্লার আপনাকে ঝাপসা ব্যাকগ্রাউন্ড সহ উইন্ডো তৈরি করার সুযোগ দেয়, যা একটি ফ্রস্টেড গ্লাস এফেক্ট তৈরি করে।

  • ব্লার বিহাইন্ড অপশনটি আপনাকে একটি (ডায়ালগ) উইন্ডোর পেছনের পুরো স্ক্রিনটি ব্লার করার সুযোগ দেয়, যা একটি ডেপথ অফ ফিল্ড এফেক্ট তৈরি করে।

এই দুটি প্রভাব আলাদাভাবে বা একত্রে ব্যবহার করা যেতে পারে, যেমনটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

শুধুমাত্র পটভূমি ঝাপসা

একটি

কেবলমাত্র পিছনে ঝাপসা

পেছনের এবং পটভূমির ঝাপসাভাব

Figure 1. Background blur only (a), blur behind only (b), background blur and blur behind (c)

উইন্ডো ব্লার ফিচারটি একাধিক উইন্ডো জুড়ে কাজ করে, যার মানে হলো আপনার উইন্ডোর পেছনে অন্য কোনো অ্যাপ থাকলেও এটি কাজ করে। এই ইফেক্টটি ব্লার রেন্ডার ইফেক্টের মতো নয়, যা একই উইন্ডোর ভেতরের কন্টেন্টকে ব্লার করে। ডায়ালগ, বটম শীট এবং অন্যান্য ফ্লোটিং উইন্ডোর জন্য উইন্ডো ব্লার বেশ উপযোগী।

বাস্তবায়ন

অ্যাপ ডেভেলপাররা

ব্লার এফেক্ট তৈরি করার জন্য অ্যাপ ডেভেলপারদের অবশ্যই একটি ব্লার রেডিয়াস দিতে হবে। ব্লার রেডিয়াস নিয়ন্ত্রণ করে ব্লারটি কতটা ঘন হবে, অর্থাৎ, রেডিয়াস যত বেশি হবে, ব্লার তত ঘন হবে। ০ পিক্সেলের ব্লার মানে কোনো ব্লার নেই। পেছনের ব্লারের জন্য, ২০ পিক্সেলের একটি রেডিয়াস ভালো ডেপথ অফ ফিল্ড এফেক্ট তৈরি করে, অন্যদিকে ৮০ পিক্সেলের একটি ব্যাকগ্রাউন্ড ব্লার রেডিয়াস ভালো ফ্রস্টেড গ্লাস এফেক্ট তৈরি করে। ১৫০ পিক্সেলের বেশি ব্লার রেডিয়াস ব্যবহার করা থেকে বিরত থাকুন, কারণ এটি পারফরম্যান্সে উল্লেখযোগ্যভাবে প্রভাব ফেলবে।

কাঙ্ক্ষিত ব্লার এফেক্ট আনতে এবং পাঠযোগ্যতা বাড়াতে, একটি স্বচ্ছ রঙের স্তরের সাথে সামঞ্জস্যপূর্ণ একটি ব্লার রেডিয়াস ভ্যালু বেছে নিন।

পটভূমি ঝাপসা

ফ্লোটিং উইন্ডোতে ব্যাকগ্রাউন্ড ব্লার ব্যবহার করে এমন একটি ব্যাকগ্রাউন্ড ইফেক্ট তৈরি করুন, যা নিচের কন্টেন্টের একটি ঝাপসা প্রতিচ্ছবি। আপনার উইন্ডোতে একটি ঝাপসা ব্যাকগ্রাউন্ড যোগ করতে, নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:

  1. ব্যাকগ্রাউন্ড ব্লার রেডিয়াস সেট করতে Window#setBackgroundBlurRadius(int) কল করুন। অথবা, উইন্ডো থিমে R.attr.windowBackgroundBlurRadius সেট করুন।

  2. উইন্ডোটিকে স্বচ্ছ করতে R.attr.windowIsTranslucent-কে true-তে সেট করুন। ব্লারটি উইন্ডোর পৃষ্ঠের নিচে আঁকা হয়, তাই ব্লারটি দৃশ্যমান হওয়ার জন্য উইন্ডোটিকে স্বচ্ছ হতে হবে।

  3. ঐচ্ছিকভাবে, একটি স্বচ্ছ রঙের আয়তাকার উইন্ডো ব্যাকগ্রাউন্ড ড্রয়েবল যোগ করতে Window#setBackgroundDrawableResource(int) কল করুন। অথবা, উইন্ডো থিমে R.attr.windowBackground সেট করুন।

  4. গোলাকার কোণাযুক্ত উইন্ডোর ক্ষেত্রে, উইন্ডোর ব্যাকগ্রাউন্ড ড্রয়েবল হিসেবে গোলাকার কোণাবিশিষ্ট একটি ShapeDrawable সেট করার মাধ্যমে ব্লার করা অংশের গোলাকার কোণাগুলো নির্ধারণ করুন।

  5. ব্লার চালু এবং বন্ধ অবস্থা নিয়ন্ত্রণ করুন। আরও তথ্যের জন্য অ্যাপে উইন্ডো ব্লার ব্যবহারের নির্দেশিকা বিভাগটি দেখুন।

পিছনে ঝাপসা

'ব্লার বিহাইন্ড' ইফেক্টটি উইন্ডোর পেছনের পুরো স্ক্রিনকে ঝাপসা করে দেয়। উইন্ডোর পেছনের স্ক্রিনের সবকিছু ঝাপসা করে দিয়ে ব্যবহারকারীর মনোযোগ উইন্ডোর ভেতরের বিষয়বস্তুর দিকে আকর্ষণ করার জন্য এই ইফেক্টটি ব্যবহার করা হয়।

আপনার উইন্ডোর পেছনের বিষয়বস্তু ঝাপসা করতে, এই ধাপগুলো অনুসরণ করুন:

  1. ব্লার বিহাইন্ড চালু করতে উইন্ডো ফ্ল্যাগ-এ FLAG_BLUR_BEHIND যোগ করুন। অথবা, উইন্ডো থিম-এ R.attr.windowBlurBehindEnabled সেট করুন।

  2. রেডিয়াসের পিছনে ব্লার সেট করতে WindowManager.LayoutParams#setBlurBehindRadius কল করুন। অথবা, উইন্ডো থিমে R.attr.windowBlurBehindRadius সেট করুন।

  3. ঐচ্ছিকভাবে, একটি পরিপূরক মৃদু আলোর পরিমাণ বেছে নিন।

  4. ব্লার চালু এবং বন্ধ অবস্থা নিয়ন্ত্রণ করুন। আরও তথ্যের জন্য অ্যাপে উইন্ডো ব্লার ব্যবহারের নির্দেশিকা বিভাগটি দেখুন।

অ্যাপে উইন্ডো ব্লার ব্যবহার করার নির্দেশিকা

উইন্ডোজ ব্লার-এর সমর্থন নিম্নলিখিত বিষয়গুলির উপর নির্ভরশীল:

  • অ্যান্ড্রয়েড সংস্করণ: উইন্ডোজ ব্লার এপিআইগুলো শুধুমাত্র অ্যান্ড্রয়েড ১২ এবং তার পরবর্তী সংস্করণগুলোতে উপলব্ধ। অ্যান্ড্রয়েড সংস্করণটি জানতে ডিভাইসের এসডিকে (SDK) দেখুন।

  • গ্রাফিক্স পারফরম্যান্স: কম শক্তিশালী জিপিইউ যুক্ত ডিভাইসগুলো উইন্ডো ব্লার সমর্থন নাও করতে পারে।

  • সিস্টেমের অবস্থা: সিস্টেম সার্ভার রানটাইমে সাময়িকভাবে উইন্ডো ব্লার নিষ্ক্রিয় করতে পারে, উদাহরণস্বরূপ, ব্যাটারি সেভিং মোডে, নির্দিষ্ট ধরণের ভিডিও কন্টেন্ট চালানোর সময় অথবা ডেভেলপারের কোনো পরিবর্তনের কারণে।

আপনার অ্যাপটিকে বিভিন্ন অ্যান্ড্রয়েড সংস্করণ, ডিভাইস এবং সিস্টেম স্টেটের সাথে সামঞ্জস্যপূর্ণ করার জন্য, এই নির্দেশিকাগুলো অনুসরণ করুন:

  • উইন্ডো ব্লার চালু বা বন্ধ হলে আপনাকে জানানোর জন্য WindowManager#addCrossWindowBlurEnabledListener- এর মাধ্যমে একটি লিসেনার যোগ করুন। এছাড়াও, উইন্ডো ব্লার বর্তমানে চালু আছে কিনা তা জানতে WindowManager#isCrossWindowBlurEnabled ব্যবহার করুন।

  • উইন্ডো ব্লারের সক্রিয় বা নিষ্ক্রিয় অবস্থার সাথে সামঞ্জস্য রাখতে উইন্ডো ব্যাকগ্রাউন্ডের দুটি সংস্করণ প্রয়োগ করুন।

    যখন ব্লার চালু থাকে, তখন ব্লারটি দৃশ্যমান করার জন্য উইন্ডোর ব্যাকগ্রাউন্ড স্বচ্ছ হওয়া উচিত। এই অবস্থায়, যখন ব্লার বন্ধ করা হয়, তখন উইন্ডোর বিষয়বস্তু সরাসরি নিচের উইন্ডোর বিষয়বস্তুর উপর চলে আসে, ফলে ওভারল্যাপিং উইন্ডোটি কম পাঠযোগ্য হয়ে পড়ে। এই ধরনের প্রভাব এড়াতে, যখন উইন্ডো ব্লার বন্ধ থাকে, তখন অ্যাপের UI নিম্নোক্তভাবে পরিবর্তন করুন:

    • ব্যাকগ্রাউন্ড ব্লার করার জন্য, উইন্ডো ব্যাকগ্রাউন্ড ড্রয়েবলের আলফা বাড়িয়ে এটিকে আরও অস্বচ্ছ করে তুলুন।

    • পেছনের অংশ ঝাপসা করার জন্য, আরও বেশি ডিম অ্যামাউন্ট সহ একটি ডিম লেয়ার যোগ করুন।

পেছনের এবং পটভূমির ব্লারের উদাহরণ

এই অংশে এমন একটি অ্যাক্টিভিটির কার্যকরী উদাহরণ দেওয়া হয়েছে যেখানে ব্লার বিহাইন্ড এবং ব্যাকগ্রাউন্ড ব্লার উভয়ই ব্যবহৃত হয়েছে।

MainActivity.java এর নিম্নলিখিত উদাহরণটি একটি ডায়ালগ বক্স, যার পেছনের ব্লার রেডিয়াস ২০ পিক্সেল এবং ব্যাকগ্রাউন্ড ব্লার রেডিয়াস ৮০ পিক্সেল। এর কোণাগুলো গোলাকার, যা 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 dp ব্যাসার্ধের গোলাকার কোণাসহ একটি ShapeDrawable হিসেবে নিম্নরূপে সংজ্ঞায়িত করি:

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

উইন্ডো ব্লার অ্যাক্টিভিটির নিচের উইন্ডোর বিষয়বস্তুকে ঝাপসা করে দেয়। ঝাপসা ছবিটি এই অ্যাক্টিভিটি উইন্ডোর নিচে আঁকা হয়, তাই ব্লারটি দৃশ্যমান হওয়ার জন্য অ্যাক্টিভিটি উইন্ডোটিকে স্বচ্ছ (translucent) হতে হবে। উইন্ডোটিকে স্বচ্ছ করতে আমরা অ্যাক্টিভিটি থিমে R.attr.windowIsTranslucent-কে নিম্নোক্তভাবে সেট করি:

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

OEM এবং অংশীদারদের

কোনো ডিভাইসে উইন্ডো ব্লারিং চালু করতে হলে, প্রস্তুতকারক কোম্পানিকে (OEM) ঘোষণা করতে হবে যে ডিভাইসটি উইন্ডো ব্লার সমর্থন করে।

আপনার ডিভাইস উইন্ডো ব্লার সমর্থন করে কিনা তা পরীক্ষা করতে, নিম্নলিখিতগুলি করুন:

  • নিশ্চিত করুন যে ডিভাইসটি অতিরিক্ত জিপিইউ লোড সামলাতে পারবে। নিম্নমানের ডিভাইসগুলো অতিরিক্ত লোড সামলাতে না পারার কারণে ফ্রেম ড্রপ হতে পারে। শুধুমাত্র পর্যাপ্ত জিপিইউ ক্ষমতাসম্পন্ন পরীক্ষিত ডিভাইসগুলোতেই উইন্ডো ব্লার চালু করুন।

  • আপনার যদি একটি কাস্টমাইজড রেন্ডার ইঞ্জিন থাকে, তবে নিশ্চিত করুন যে আপনার রেন্ডার ইঞ্জিনটি ব্লারিং লজিক প্রয়োগ করে। ডিফল্ট অ্যান্ড্রয়েড ১২ রেন্ডার ইঞ্জিনটি BlurFilter.cpp ফাইলে ব্লারিং লজিক প্রয়োগ করে।

আপনার ডিভাইসটি উইন্ডো ব্লার সমর্থন করে তা নিশ্চিত করার পর, নিম্নলিখিত সারফেস ফ্লিঙ্গার sysprop সেট করুন:

PRODUCT_VENDOR_PROPERTIES += \
       ro.surface_flinger.supports_background_blur=1

বৈধতা

আপনার অ্যাপ উইন্ডোটি ব্লার সক্রিয় এবং ব্লার নিষ্ক্রিয় অবস্থার মধ্যে পরিবর্তন করার সময় সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে, এই ধাপগুলো অনুসরণ করুন:

  1. যে UI-টিতে ব্লার আছে, সেটি খুলুন।

  2. উইন্ডো ব্লার অন এবং অফ করে উইন্ডো ব্লার চালু বা বন্ধ করুন।

  3. যাচাই করুন যে উইন্ডো UI প্রত্যাশা অনুযায়ী ঝাপসা অবস্থায় পরিবর্তিত হচ্ছে এবং আবার আগের অবস্থায় ফিরে আসছে।

উইন্ডো ব্লার চালু এবং বন্ধ করুন

উইন্ডো ব্লার এফেক্ট সহ উইন্ডো UI কীভাবে রেন্ডার হয় তা পরীক্ষা করতে, নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে ব্লার সক্ষম বা অক্ষম করুন:

  • ডেভেলপার অপশন থেকে:

    সেটিংস -> সিস্টেম -> ডেভেলপার অপশন -> হার্ডওয়্যার অ্যাক্সিলারেটেড রেন্ডারিং -> উইন্ডো-লেভেল ব্লার অনুমোদন করুন

  • রুট করা ডিভাইসের টার্মিনাল থেকে:

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

আপনার অ্যান্ড্রয়েড ১২+ ডিভাইসটি উইন্ডো ব্লার সমর্থন করে কিনা এবং বর্তমানে তা চালু আছে কিনা, তা পরীক্ষা করতে একটি রুটেড ডিভাইসে adb shell wm disable-blur চালান।

সমস্যা সমাধান

যাচাইকরণের সময় সমস্যা সমাধানের জন্য নিম্নলিখিত নির্দেশিকাটি ব্যবহার করুন।

কোন ঝাপসা আঁকা নেই

  • ব্লার বর্তমানে চালু আছে কিনা এবং আপনার হার্ডওয়্যার তা সমর্থন করে কিনা, তা যাচাই করুন। 'উইন্ডো ব্লার চালু ও বন্ধ করুন ' অংশটি দেখুন।

  • নিশ্চিত করুন যে আপনি উইন্ডোর ব্যাকগ্রাউন্ডের রঙটি স্বচ্ছ বা ট্রান্সলুসেন্ট রেখেছেন। উইন্ডোর ব্যাকগ্রাউন্ডের রঙ অস্বচ্ছ হলে ব্লার করা অংশটি ঢাকা পড়ে যায়।

টেস্ট ডিভাইসটি উইন্ডো ব্লার সমর্থন করে না।

  • আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড ১২ এমুলেটরে পরীক্ষা করুন। একটি অ্যান্ড্রয়েড এমুলেটর সেট আপ করতে, "অ্যান্ড্রয়েড এমুলেটর সেট আপ করুন" অংশটি দেখুন। এমুলেটর দিয়ে তৈরি করা যেকোনো অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস উইন্ডো ব্লার সমর্থন করে।

কোন গোলাকার কোণ নেই

ডেভেলপার অপশন আপডেট করলে ব্লার চালু হয় না।

  • ডিভাইসটি ব্যাটারি-সেভিং মোডে আছে কিনা অথবা মাল্টিমিডিয়া টানেলিং ব্যবহার করছে কিনা তা পরীক্ষা করুন। কিছু টিভি ডিভাইসে ভিডিও প্লেব্যাকের সময় উইন্ডো ব্লারও নিষ্ক্রিয় থাকতে পারে।

ব্যাকগ্রাউন্ড ব্লার পুরো স্ক্রিন জুড়ে আঁকা হয়, উইন্ডোর সীমার মধ্যে নয়।

লিসেনার থেকে আসা আপডেটগুলো স্ক্রিনে প্রয়োগ করা হয় না।

  • লিসেনার আপডেটগুলো হয়তো একটি পুরোনো উইন্ডো ইনস্ট্যান্সে প্রয়োগ হয়ে যাচ্ছে। উইন্ডোটি ডেস্ট্রয় হয়ে সঠিক লিসেনার আপডেটসহ পুনরায় তৈরি হচ্ছে কি না, তা পরীক্ষা করে দেখুন।