কম্পোজ লেআউট মডেল আপনাকে AlignmentLine ব্যবহার করে কাস্টম অ্যালাইনমেন্ট লাইন তৈরি করার সুযোগ দেয়, যা প্যারেন্ট লেআউটগুলো তাদের চাইল্ড লেআউটগুলোকে অ্যালাইন ও পজিশন করার জন্য ব্যবহার করতে পারে। উদাহরণস্বরূপ, Row তার চাইল্ড লেআউটগুলোকে অ্যালাইন করার জন্য তাদের কাস্টম অ্যালাইনমেন্ট লাইন ব্যবহার করতে পারে।
যখন কোনো লেআউট একটি নির্দিষ্ট AlignmentLine জন্য একটি মান প্রদান করে, তখন লেআউটটির প্যারেন্টরা সংশ্লিষ্ট Placeable ইনস্ট্যান্সের উপর Placeable.get অপারেটর ব্যবহার করে পরিমাপ করার পর সেই মানটি পড়তে পারে। AlignmentLine এর অবস্থানের উপর ভিত্তি করে, প্যারেন্টরা তখন চাইল্ডদের অবস্থান নির্ধারণ করতে পারে।
Compose-এর কিছু কম্পোজেবলে আগে থেকেই অ্যালাইনমেন্ট লাইন থাকে। উদাহরণস্বরূপ, BasicText কম্পোজেবলটি FirstBaseline এবং LastBaseline অ্যালাইনমেন্ট লাইনগুলো প্রদর্শন করে।
নিচের উদাহরণে, firstBaselineToTop নামের একটি কাস্টম LayoutModifier Text এর প্রথম বেসলাইন থেকে প্যাডিং যোগ করার জন্য FirstBaseline কে রিড করে।

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 নামে দুটি অ্যালাইনমেন্ট লাইন প্রকাশ করে, যাতে অন্যান্য কম্পোজেবলগুলো চার্টের সর্বোচ্চ এবং সর্বনিম্ন ডেটা মানের সাথে অ্যালাইন করতে পারে। Max এবং Min নামে দুটি টেক্সট এলিমেন্টকে কাস্টম অ্যালাইনমেন্ট লাইনগুলোর কেন্দ্রে অ্যালাইন করা হয়েছে।

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 টাইপের, কারণ এগুলো চাইল্ড চার্টগুলোকে উল্লম্বভাবে অ্যালাইন করতে ব্যবহৃত হয়। যদি একাধিক লেআউট এই অ্যালাইনমেন্ট লাইনগুলোর জন্য কোনো ভ্যালু প্রদান করে, তবে একটি মার্জ পলিসি প্যারামিটার হিসেবে পাস করা হয়। যেহেতু কম্পোজ লেআউটের সিস্টেম কোঅর্ডিনেট এবং 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) ) } }
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- কম্পোজে গ্রাফিক্স
- কাস্টম লেআউট {:#custom-layouts }
- কম্পোজ লেআউটে অন্তর্নিহিত পরিমাপ