কম্পোজের নিয়মগুলির মধ্যে একটি হল যে আপনি শুধুমাত্র একবার আপনার বাচ্চাদের পরিমাপ করবেন; শিশুদের দুবার পরিমাপ করা একটি রানটাইম ব্যতিক্রম নিক্ষেপ করে। যাইহোক, এমন কিছু সময় আছে যখন আপনার বাচ্চাদের পরিমাপ করার আগে তাদের সম্পর্কে কিছু তথ্য প্রয়োজন।
Intrinsics আপনাকে বাচ্চাদের প্রকৃতপক্ষে পরিমাপ করার আগে জিজ্ঞাসা করতে দেয়।
একটি কম্পোজেবলের জন্য, আপনি এর IntrinsicSize.Min
বা IntrinsicSize.Max
চাইতে পারেন:
-
Modifier.width(IntrinsicSize.Min)
- আপনার বিষয়বস্তু সঠিকভাবে প্রদর্শন করার জন্য আপনাকে সর্বনিম্ন প্রস্থ কত হতে হবে? -
Modifier.width(IntrinsicSize.Max)
- আপনার বিষয়বস্তু সঠিকভাবে প্রদর্শন করার জন্য আপনার সর্বোচ্চ কত প্রস্থ প্রয়োজন? -
Modifier.height(IntrinsicSize.Min)
- আপনার বিষয়বস্তু সঠিকভাবে প্রদর্শন করার জন্য আপনাকে সর্বনিম্ন উচ্চতা কত হতে হবে? -
Modifier.height(IntrinsicSize.Max)
- আপনার বিষয়বস্তু সঠিকভাবে প্রদর্শন করতে আপনার সর্বোচ্চ কত উচ্চতা প্রয়োজন?
উদাহরণস্বরূপ, যদি আপনি একটি কাস্টম লেআউটে অসীম width
সীমাবদ্ধতা সহ একটি 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 ) VerticalDivider( 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 ) VerticalDivider( 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
উচ্চতা নিম্নরূপ নির্ধারিত হয়:
-
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 রচনা পর্যায়