জানালা ঝাপসা

অ্যান্ড্রয়েড 12-এ, পাবলিক APIগুলি উইন্ডো-ব্লার প্রভাবগুলি প্রয়োগ করার জন্য উপলব্ধ, যেমন ব্যাকগ্রাউন্ড ব্লার এবং ব্লার পিছনে।

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

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

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

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

শুধুমাত্র ব্যাকগ্রাউন্ড ব্লার

শুধু পিছনে ঝাপসা

পিছনে ঝাপসা এবং ব্যাকগ্রাউন্ড ব্লার

চিত্র 1. ব্যাকগ্রাউন্ড ব্লার শুধুমাত্র (a), শুধুমাত্র পিছনে ঝাপসা (b), ব্যাকগ্রাউন্ড ব্লার এবং পিছনে ঝাপসা (c)

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

বাস্তবায়ন

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

একটি অস্পষ্ট প্রভাব তৈরি করতে অ্যাপ বিকাশকারীদের অবশ্যই একটি অস্পষ্ট ব্যাসার্ধ সরবরাহ করতে হবে৷ ব্লার ব্যাসার্ধ নিয়ন্ত্রণ করে কত ঘন ব্লার, অর্থাৎ, ব্যাসার্ধ যত বেশি হবে তত ঘনত্ব ঝাপসা। 0 px এর একটি অস্পষ্ট মানে কোন অস্পষ্টতা নেই৷ পিছনে ব্লার করার জন্য, 20 পিক্সেল ব্যাসার্ধ একটি ভাল গভীরতা ফিল্ড ইফেক্ট তৈরি করে, যখন 80 পিক্সেলের ব্যাকগ্রাউন্ড ব্লার ব্যাসার্ধ একটি ভাল ফ্রস্টেড গ্লাস ইফেক্ট তৈরি করে। 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. অস্পষ্টতা সক্ষম এবং অক্ষম অবস্থায় পরিচালনা করুন। আরও তথ্যের জন্য অ্যাপস বিভাগে উইন্ডো ব্লার ব্যবহার করার জন্য নির্দেশিকা পড়ুন।

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

উইন্ডোজ ব্লার জন্য সমর্থন নিম্নলিখিত উপর নির্ভর করে:

  • অ্যান্ড্রয়েড সংস্করণ: উইন্ডোজ ব্লার এপিআই শুধুমাত্র অ্যান্ড্রয়েড 12 এবং উচ্চতর সংস্করণে উপলব্ধ। Android সংস্করণের জন্য ডিভাইস SDK চেক করুন.

  • গ্রাফিক্স পারফরম্যান্স: কম পারফরম্যান্সযুক্ত GPU সহ ডিভাইসগুলি উইন্ডো ব্লার সমর্থন না করা বেছে নিতে পারে।

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

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

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

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

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

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

    • পিছনে ঝাপসা করার জন্য, একটি উচ্চতর আবছা পরিমাণের সাথে একটি আবছা স্তর যোগ করুন।

পিছনে এবং ব্যাকগ্রাউন্ড ব্লার করার উদাহরণ

এই বিভাগটি এমন একটি ক্রিয়াকলাপের একটি কার্যকর উদাহরণ প্রদান করে যা পিছনে এবং ব্যাকগ্রাউন্ড ব্লার উভয়ই ব্যবহার করে।

MainActivity.java এর নিম্নলিখিত উদাহরণ হল 20 পিক্সেল ব্যাসার্ধের পিছনে একটি ব্লার এবং 80 পিক্সেলের ব্যাকগ্রাউন্ড ব্লার ব্যাসার্ধের একটি ডায়ালগ। এটির বৃত্তাকার কোণ রয়েছে, উইন্ডোর পটভূমিতে 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>

উইন্ডো অস্পষ্টতা কার্যকলাপের নীচে উইন্ডোর বিষয়বস্তু অস্পষ্ট করে। অস্পষ্ট চিত্রটি এই অ্যাক্টিভিটি উইন্ডোর নীচে আঁকা হয়েছে, তাই অস্পষ্টতা দৃশ্যমান হওয়ার জন্য অ্যাক্টিভিটি উইন্ডোটি স্বচ্ছ হওয়া দরকার। উইন্ডোটিকে স্বচ্ছ করতে আমরা 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. ব্লার আছে এমন UI খুলুন।

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

  3. যাচাই করুন যে উইন্ডো UI প্রত্যাশিত হিসাবে একটি অস্পষ্ট অবস্থায় এবং থেকে পরিবর্তিত হয়।

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

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

  • বিকাশকারী বিকল্পগুলি থেকে:

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

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

    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 চেক করুন।

  • নিশ্চিত করুন যে একটি উইন্ডো পটভূমি অঙ্কনযোগ্য সেট করা আছে। এই সেটিংটি অস্পষ্ট এলাকার রূপরেখা নির্ধারণ করে।

শ্রোতা থেকে আপডেট পর্দায় প্রয়োগ করা হয় না

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