কম্পোজের নিয়মগুলির মধ্যে একটি হল যে আপনি শুধুমাত্র একবার আপনার বাচ্চাদের পরিমাপ করবেন; শিশুদের দুবার পরিমাপ করা একটি রানটাইম ব্যতিক্রম নিক্ষেপ করে। যাইহোক, এমন কিছু সময় আছে যখন আপনার বাচ্চাদের পরিমাপ করার আগে তাদের সম্পর্কে কিছু তথ্য প্রয়োজন।
Intrinsics আপনাকে বাচ্চাদের প্রকৃতপক্ষে পরিমাপ করার আগে জিজ্ঞাসা করতে দেয়।
একটি কম্পোজেবলের জন্য, আপনি এর intrinsicWidth
বা intrinsicHeight
জানতে চাইতে পারেন:
-
(min|max)IntrinsicWidth
-
(min|max)IntrinsicHeight
উদাহরণস্বরূপ, আপনি যদি অসীম height
সহ একটি Text
minIntrinsicHeight
জিজ্ঞাসা করেন, তাহলে এটি Text
height
ফিরিয়ে দেবে যেন পাঠ্যটি একটি লাইনে আঁকা হয়েছে।
কর্মের মধ্যে অন্তর্নিহিত
কল্পনা করুন যে আমরা একটি কম্পোজেবল তৈরি করতে চাই যা স্ক্রিনে দুটি পাঠ্য প্রদর্শন করে এই মত একটি বিভাজক দ্বারা পৃথক করা হয়:
আমরা কিভাবে এটা করতে পারি? আমাদের ভিতরে দুটি Text
সহ একটি Row
থাকতে পারে যেটি যতটা সম্ভব প্রসারিত হয় এবং মাঝখানে একটি Divider
। আমরা চাই Divider
সবচেয়ে লম্বা Text
মতো লম্বা এবং পাতলা হোক ( width = 1.dp
)।
@Composable fun TwoTexts(modifier: Modifier = Modifier, text1: String, text2: String) { Row(modifier = modifier) { Text( modifier = Modifier .weight(1f) .padding(start = 4.dp) .wrapContentWidth(Alignment.Start), text = text1 ) HorizontalDivider( color = Color.Black, modifier = Modifier.fillMaxHeight().width(1.dp) ) Text( modifier = Modifier .weight(1f) .padding(end = 4.dp) .wrapContentWidth(Alignment.End), text = text2 ) } }
যদি আমরা এটির পূর্বরূপ দেখি, আমরা দেখতে পাই যে Divider
পুরো পর্দায় প্রসারিত হয় এবং আমরা যা চাই তা নয়:
এটি ঘটে কারণ Row
প্রতিটি শিশুকে পৃথকভাবে পরিমাপ করে এবং Text
উচ্চতা Divider
সীমাবদ্ধ করতে ব্যবহার করা যাবে না। আমরা চাই Divider
একটি প্রদত্ত উচ্চতা দিয়ে উপলব্ধ স্থান পূরণ করুক। এর জন্য, আমরা height(IntrinsicSize.Min)
মডিফায়ার ব্যবহার করতে পারি।
height(IntrinsicSize.Min)
মাপ তার বাচ্চাদের তাদের ন্যূনতম অন্তর্নিহিত উচ্চতার মতো লম্বা হতে বাধ্য করা হচ্ছে। যেহেতু এটি পুনরাবৃত্ত, এটি Row
এবং এর বাচ্চাদের minIntrinsicHeight
জিজ্ঞাসা করবে।
আমাদের কোডে এটি প্রয়োগ করা, এটি প্রত্যাশিত হিসাবে কাজ করবে:
@Composable fun TwoTexts(modifier: Modifier = Modifier, text1: String, text2: String) { Row(modifier = modifier.height(IntrinsicSize.Min)) { Text( modifier = Modifier .weight(1f) .padding(start = 4.dp) .wrapContentWidth(Alignment.Start), text = text1 ) HorizontalDivider( color = Color.Black, modifier = Modifier.fillMaxHeight().width(1.dp) ) Text( modifier = Modifier .weight(1f) .padding(end = 4.dp) .wrapContentWidth(Alignment.End), text = text2 ) } } // @Preview @Composable fun TwoTextsPreview() { MaterialTheme { Surface { TwoTexts(text1 = "Hi", text2 = "there") } } }
পূর্বরূপ সহ:
Row
কম্পোজেবল এর minIntrinsicHeight
হবে তার বাচ্চাদের সর্বোচ্চ minIntrinsicHeight
। Divider
উপাদানটির minIntrinsicHeight
হল 0 কারণ এটি স্থান দখল করে না যদি কোন সীমাবদ্ধতা না দেওয়া হয়; Text
minIntrinsicHeight
হবে একটি নির্দিষ্ট width
দেওয়া টেক্সটের। অতএব, Row
উপাদানের height
সীমাবদ্ধতা হবে Text
সর্বোচ্চ minIntrinsicHeight
। Divider
তারপর Row
দ্বারা প্রদত্ত height
সীমাবদ্ধতার height
প্রসারিত করবে।
আপনার কাস্টম লেআউটে অন্তর্নিহিত
একটি কাস্টম Layout
বা layout
সংশোধক তৈরি করার সময়, আনুমানিকতার উপর ভিত্তি করে অভ্যন্তরীণ পরিমাপ স্বয়ংক্রিয়ভাবে গণনা করা হয়। অতএব, সমস্ত লেআউটের জন্য গণনা সঠিক নাও হতে পারে। এই APIগুলি এই ডিফল্টগুলিকে ওভাররাইড করার বিকল্পগুলি অফার করে৷
আপনার কাস্টম Layout
অন্তর্নিহিত পরিমাপ নির্দিষ্ট করতে, এটি তৈরি করার সময় MeasurePolicy
ইন্টারফেসের minIntrinsicWidth
, minIntrinsicHeight
, maxIntrinsicWidth
, এবং maxIntrinsicHeight
ওভাররাইড করুন৷
@Composable fun MyCustomComposable( modifier: Modifier = Modifier, content: @Composable () -> Unit ) { Layout( content = content, modifier = modifier, measurePolicy = object : MeasurePolicy { override fun MeasureScope.measure( measurables: List<Measurable>, constraints: Constraints ): MeasureResult { // Measure and layout here // ... } override fun IntrinsicMeasureScope.minIntrinsicWidth( measurables: List<IntrinsicMeasurable>, height: Int ): Int { // Logic here // ... } // Other intrinsics related methods have a default value, // you can override only the methods that you need. } ) }
আপনার কাস্টম layout
মডিফায়ার তৈরি করার সময়, LayoutModifier
ইন্টারফেসে সম্পর্কিত পদ্ধতিগুলিকে ওভাররাইড করুন।
fun Modifier.myCustomModifier(/* ... */) = this then object : LayoutModifier { override fun MeasureScope.measure( measurable: Measurable, constraints: Constraints ): MeasureResult { // Measure and layout here // ... } override fun IntrinsicMeasureScope.minIntrinsicWidth( measurable: IntrinsicMeasurable, height: Int ): Int { // Logic here // ... } // Other intrinsics related methods have a default value, // you can override only the methods that you need. }
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- কাস্টম লেআউট {:#custom-layouts }
- জেটপ্যাক রচনায় সারিবদ্ধ লাইন
- Jetpack রচনা পর্যায়