WindowInsetsRulers সম্পর্কে

WindowInsets হল জেটপ্যাক কম্পোজের স্ট্যান্ডার্ড এপিআই যা স্ক্রীনের ক্ষেত্রগুলি পরিচালনা করার জন্য যা সিস্টেম UI দ্বারা আংশিক বা সম্পূর্ণরূপে অস্পষ্ট। এই ক্ষেত্রগুলির মধ্যে রয়েছে স্ট্যাটাস বার, নেভিগেশন বার এবং অন-স্ক্রিন কীবোর্ড। আপনি বিকল্পভাবে পূর্বনির্ধারিত WindowInsetsRulers যেমন SafeDrawing Modifier.fitInside বা Modifier.fitOutside এ পাস করতে পারেন আপনার বিষয়বস্তুকে সিস্টেম বার এবং ডিসপ্লে কাটআউটের সাথে সারিবদ্ধ করতে বা কাস্টম WindowInsetsRulers তৈরি করতে পারেন।

WindowInsetsRulers এর সুবিধা

  • খরচের জটিলতা এড়ায় : এটি লেআউটের স্থান নির্ধারণের পর্যায়ে কাজ করে। এর মানে এটি সম্পূর্ণরূপে ইনসেট কনজাম্পশন চেইনকে বাইপাস করে এবং প্যারেন্ট লেআউটগুলি যা করেছে তা নির্বিশেষে সবসময় সিস্টেম বার এবং ডিসপ্লে কাটআউটগুলির সঠিক, পরম অবস্থান প্রদান করতে পারে। যখন পূর্বপুরুষ কম্পোজেবল ভুলভাবে ইনসেট ব্যবহার করে তখন Modifier.fitInside বা Modifier.fitOutside পদ্ধতিগুলি সমস্যা সমাধানে সহায়ক।
  • সহজে সিস্টেম বারগুলি এড়িয়ে চলুন : এটি আপনার অ্যাপের সামগ্রীকে সিস্টেম বার এবং ডিসপ্লে কাটআউট এড়াতে সাহায্য করে এবং সরাসরি WindowInsets ব্যবহার করার চেয়ে আরও সহজ হতে পারে৷
  • অত্যন্ত কাস্টমাইজযোগ্য : ডেভেলপাররা কাস্টম রুলারের সাথে বিষয়বস্তু সারিবদ্ধ করতে পারে এবং কাস্টম লেআউটের সাথে তাদের লেআউটের উপর সুনির্দিষ্ট নিয়ন্ত্রণ রাখতে পারে।

WindowInsetsRulers এর অসুবিধা

  • পরিমাপের জন্য ব্যবহার করা যাবে না : কারণ এটি স্থান নির্ধারণের পর্যায়ে কাজ করে, এটি যে অবস্থানগত তথ্য প্রদান করে তা পূর্ববর্তী পরিমাপের পর্যায়ে উপলব্ধ নয়
  • লেআউট অস্থিরতার জন্য সম্ভাব্য : এটি ক্র্যাশের কারণ হতে পারে যদি একটি পিতামাতার লেআউটের আকার তার সন্তানদের আকারের উপর নির্ভর করে। যেহেতু WindowInsetsRulers ব্যবহার করা একটি শিশু প্লেসমেন্টের সময় তার অবস্থান বা আকার পরিবর্তন করতে পারে, এটি একটি অস্থির লেআউট চক্র তৈরি করতে পারে।

কাস্টম WindowInsetsRulers তৈরি করুন

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

@Composable
fun WindowInsetsRulersDemo(modifier: Modifier) {
    Box(
        contentAlignment = BottomCenter,
        modifier = modifier
            .fillMaxSize()
            // The mistake that causes issues downstream, as .padding doesn't consume insets.
            // While it's correct to instead use .windowInsetsPadding(WindowInsets.navigationBars),
            // assume it's difficult to identify this issue to see how WindowInsetsRulers can help.
            .padding(WindowInsets.navigationBars.asPaddingValues())
    ) {
        TextField(
            value = "Demo IME Insets",
            onValueChange = {},
            modifier = modifier
                // Use alignToSafeDrawing() instead of .imePadding() to precisely place this child
                // Composable without having to fix the parent upstream.
                .alignToSafeDrawing()

            // .imePadding()
            // .fillMaxWidth()
        )
    }
}

fun Modifier.alignToSafeDrawing(): Modifier {
    return layout { measurable, constraints ->
        if (constraints.hasBoundedWidth && constraints.hasBoundedHeight) {
            val placeable = measurable.measure(constraints)
            val width = placeable.width
            val height = placeable.height
            layout(width, height) {
                val bottom = WindowInsetsRulers.SafeDrawing.current.bottom
                    .current(0f).roundToInt() - height
                val right = WindowInsetsRulers.SafeDrawing.current.right
                    .current(0f).roundToInt()
                val left = WindowInsetsRulers.SafeDrawing.current.left
                    .current(0f).roundToInt()
                measurable.measure(Constraints.fixed(right - left, height))
                    .place(left, bottom)
            }
        } else {
            val placeable = measurable.measure(constraints)
            layout(placeable.width, placeable.height) {
                placeable.place(0, 0)
            }
        }
    }
}

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

যাচাই করুন যে বাবা-মা বাধ্য

WindowInsetsRulers নিরাপদে ব্যবহার করার জন্য, নিশ্চিত করুন যে অভিভাবক বৈধ সীমাবদ্ধতা প্রদান করে। পিতামাতার অবশ্যই একটি সংজ্ঞায়িত আকার থাকতে হবে এবং WindowInsetsRulers ব্যবহার করে এমন একটি শিশুর আকারের উপর নির্ভর করতে পারে না। প্যারেন্ট কম্পোজেবলে fillMaxSize বা অন্য সাইজ মডিফায়ার ব্যবহার করুন।

একইভাবে, একটি কম্পোজেবল স্থাপন করা যা WindowInsetsRulers ব্যবহার করে verticalScroll এর মতো একটি স্ক্রলিং পাত্রে অপ্রত্যাশিত আচরণের কারণ হতে পারে কারণ স্ক্রোলিং কন্টেইনারটি সীমাহীন উচ্চতা সীমাবদ্ধতা প্রদান করে, যা শাসকের যুক্তির সাথে সামঞ্জস্যপূর্ণ নয়।