রচনা লেআউটে অন্তর্নিহিত পরিমাপ

কম্পোজের নিয়মগুলির মধ্যে একটি হল যে আপনি শুধুমাত্র একবার আপনার বাচ্চাদের পরিমাপ করবেন; শিশুদের দুবার পরিমাপ করা একটি রানটাইম ব্যতিক্রম নিক্ষেপ করে। যাইহোক, এমন কিছু সময় আছে যখন আপনার বাচ্চাদের পরিমাপ করার আগে তাদের সম্পর্কে কিছু তথ্য প্রয়োজন।

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 ব্যবহার করুন যা উপলব্ধ স্থান পূরণ করে এবং মাঝখানে একটি DividerDivider সবচেয়ে লম্বা 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.
}

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}