কম্পোজ লেআউট মডেল আপনাকে কাস্টম
অ্যালাইনমেন্ট লাইন তৈরি করতে AlignmentLine ব্যবহার করতে দেয় যা প্যারেন্ট লেআউট তাদের
চিলড্রেনকে অ্যালাইন ও পজিশন করতে ব্যবহার করতে পারে। যেমন, Row তার চাইল্ডের কাস্টম অ্যালাইনমেন্ট লাইন ব্যবহার করে
সেগুলিকে অ্যালাইন করতে পারে।
কোনও লেআউট যখন নির্দিষ্ট AlignmentLine-এর জন্য ভ্যালু প্রদান করে, তখন লেআউটের
প্যারেন্টরা সংশ্লিষ্ট Placeable ইনস্ট্যান্সে Placeable.get
অপারেটর ব্যবহার করে পরিমাপ করার পরে এই ভ্যালু পড়তে পারে। AlignmentLine-এর পজিশনের
উপর ভিত্তি করে, অভিভাবক তারপর সন্তানের
পজিশন নির্ধারণ করতে পারবেন।
Compose-এ কিছু কম্পোজ করার উপযুক্ত আইটেম আগে থেকেই অ্যালাইনমেন্ট লাইন সহ আসে। যেমন, BasicText কম্পোজ করার উপযুক্ত আইটেমটি FirstBaseline এবং LastBaseline
অ্যালাইনমেন্ট লাইন দেখায়।
নিচের উদাহরণে, একটি কাস্টম LayoutModifier যার নাম
firstBaselineToTop, সেটি FirstBaseline পড়ে Text-এ প্যাডিং যোগ করে
যা সেটির প্রথম বেসলাইন থেকে শুরু হয়।
fun Modifier.firstBaselineToTop( firstBaselineToTop: Dp, ) = layout { measurable, constraints -> // Measure the composable val placeable = measurable.measure(constraints) // Check the composable has a first baseline check(placeable[FirstBaseline] != AlignmentLine.Unspecified) val firstBaseline = placeable[FirstBaseline] // Height of the composable with padding - first baseline val placeableY = firstBaselineToTop.roundToPx() - firstBaseline val height = placeable.height + placeableY layout(placeable.width, height) { // Where the composable gets placed placeable.placeRelative(0, placeableY) } } @Preview @Composable private fun TextWithPaddingToBaseline() { MaterialTheme { Text("Hi there!", Modifier.firstBaselineToTop(32.dp)) } }
উদাহরণে FirstBaseline পড়ার জন্য, পরিমাপের ধাপে placeable [FirstBaseline]
ব্যবহার করা হয়েছে।
কাস্টম অ্যালাইনমেন্ট লাইন তৈরি করা
কাস্টম Layout কম্পোজ করার মতো আইটেম বা কাস্টম
LayoutModifier তৈরি করার সময়, আপনি কাস্টম অ্যালাইনমেন্ট লাইন প্রদান করতে পারেন যাতে অন্যান্য
প্যারেন্ট কম্পোজ করার মতো আইটেম সেগুলিকে ব্যবহার করে তাদের চাইল্ড
আইটেমকে সেই অনুযায়ী অ্যালাইন ও পজিশন করতে পারে।
নিচে দেওয়া উদাহরণে একটি কাস্টম BarChart কম্পোজ করার উপযুক্ত আইটেম দেখানো হয়েছে যা দুটি
অ্যালাইনমেন্ট লাইন, MaxChartValue ও MinChartValue দেখায়, যাতে অন্যান্য কম্পোজ করার উপযুক্ত আইটেম
চার্টের সর্বাধিক ও সর্বনিম্ন ডেটা ভ্যালুর সাথে অ্যালাইন করতে পারে। দুটি টেক্সট এলিমেন্ট,
সর্বাধিক ও সর্বনিম্ন কাস্টম অ্যালাইনমেন্ট লাইনের কেন্দ্রে অ্যালাইন করা হয়েছে।
BarChart সর্বাধিক ও
সর্বনিম্ন ডেটা ভ্যালুর সাথে অ্যালাইন করা টেক্সটের সাথে কম্পোজ করার উপযুক্ত।কাস্টম অ্যালাইনমেন্ট লাইন আপনার প্রোজেক্টে টপ-লেভেল ভেরিয়েবল হিসেবে সংজ্ঞায়িত করা হয়।
/** * AlignmentLine defined by the maximum data value in a [BarChart] */ private val MaxChartValue = HorizontalAlignmentLine(merger = { old, new -> min(old, new) }) /** * AlignmentLine defined by the minimum data value in a [BarChart] */ private val MinChartValue = HorizontalAlignmentLine(merger = { old, new -> max(old, new) })
আমাদের উদাহরণ তৈরি করার জন্য কাস্টম অ্যালাইনমেন্ট লাইন হল
HorizontalAlignmentLine ধরনের, কারণ
এগুলি বাচ্চাদের ভার্টিক্যালি অ্যালাইন করতে ব্যবহার করা হয়। একাধিক লেআউট এইসব অ্যালাইনমেন্ট লাইনের জন্য ভ্যালু প্রদান করলে, মার্জ করার নীতিকে
প্যারামিটার হিসেবে পাস করা হয়। যেহেতু
Compose লেআউট সিস্টেম কোঅর্ডিনেট এবং Canvas
কোঅর্ডিনেট [0, 0], উপরের বাঁদিকের কোণ এবং x ও y অ্যাক্সিসকে
নিচের দিকে পজিটিভ হিসেবে দেখায়, তাই MaxChartValue ভ্যালু সবসময় MinChartValue-এর
চেয়ে ছোট হবে। তাই, সর্বাধিক চার্ট
ডেটা ভ্যালু বেসলাইনের জন্য মার্জ করার নীতি হল min এবং ন্যূনতম চার্ট ডেটা ভ্যালু বেসলাইনের জন্য max।
কাস্টম Layout বা LayoutModifier তৈরি করার সময়, MeasureScope.layout পদ্ধতিতে কাস্টম অ্যালাইনমেন্ট
লাইন নির্দিষ্ট করুন, যা একটি
alignmentLines: Map<AlignmentLine, Int> প্যারামিটার নেয়।
@Composable private fun BarChart( dataPoints: List<Int>, modifier: Modifier = Modifier, ) { val maxValue: Float = remember(dataPoints) { dataPoints.maxOrNull()!! * 1.2f } BoxWithConstraints(modifier = modifier) { val density = LocalDensity.current with(density) { // ... // Calculate baselines val maxYBaseline = // ... val minYBaseline = // ... Layout( content = {}, modifier = Modifier.drawBehind { // ... } ) { _, constraints -> with(constraints) { layout( width = if (hasBoundedWidth) maxWidth else minWidth, height = if (hasBoundedHeight) maxHeight else minHeight, // Custom AlignmentLines are set here. These are propagated // to direct and indirect parent composables. alignmentLines = mapOf( MinChartValue to minYBaseline.roundToInt(), MaxChartValue to maxYBaseline.roundToInt() ) ) {} } } } } }
এই কম্পোজ করার উপযুক্ত আইটেমের প্রত্যক্ষ ও পরোক্ষ অভিভাবক অ্যালাইনমেন্ট
লাইন ব্যবহার করতে পারবেন। নিম্নলিখিত কম্পোজ করার উপযুক্ত আইটেম একটি কাস্টম লেআউট তৈরি করে যা দুটি Text স্লট এবং ডেটা পয়েন্টকে প্যারামিটার হিসেবে নেয় এবং দুটি টেক্সটকে
সর্বাধিক ও সর্বনিম্ন চার্ট ডেটা ভ্যালুর সাথে অ্যালাইন করে। এই কম্পোজ করার উপযুক্ত আইটেমের প্রিভিউ
চিত্র ২-এ দেখানো হয়েছে।
@Composable private fun BarChartMinMax( dataPoints: List<Int>, maxText: @Composable () -> Unit, minText: @Composable () -> Unit, modifier: Modifier = Modifier, ) { Layout( content = { maxText() minText() // Set a fixed size to make the example easier to follow BarChart(dataPoints, Modifier.size(200.dp)) }, modifier = modifier ) { measurables, constraints -> check(measurables.size == 3) val placeables = measurables.map { it.measure(constraints.copy(minWidth = 0, minHeight = 0)) } val maxTextPlaceable = placeables[0] val minTextPlaceable = placeables[1] val barChartPlaceable = placeables[2] // Obtain the alignment lines from BarChart to position the Text val minValueBaseline = barChartPlaceable[MinChartValue] val maxValueBaseline = barChartPlaceable[MaxChartValue] layout(constraints.maxWidth, constraints.maxHeight) { maxTextPlaceable.placeRelative( x = 0, y = maxValueBaseline - (maxTextPlaceable.height / 2) ) minTextPlaceable.placeRelative( x = 0, y = minValueBaseline - (minTextPlaceable.height / 2) ) barChartPlaceable.placeRelative( x = max(maxTextPlaceable.width, minTextPlaceable.width) + 20, y = 0 ) } } } @Preview @Composable private fun ChartDataPreview() { MaterialTheme { BarChartMinMax( dataPoints = listOf(4, 24, 15), maxText = { Text("Max") }, minText = { Text("Min") }, modifier = Modifier.padding(24.dp) ) } }
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- Compose-এ গ্রাফিক্স
- কাস্টম লেআউট {:#custom-layouts }
- Compose লেআউটে অন্তর্নিহিত পরিমাপ