См. Код ниже: < /p>
Код: Выделить всё
@Composable
fun LimitedWidthWithInBox(
modifier: Modifier = Modifier
) {
Box(modifier = modifier.fillMaxWidth()) {
// 🟣 Background box (fixed width, fills height of parent)
Box(
modifier = Modifier
.matchParentSize() // match height of Box (driven by content)
.width(40.dp) // fixed width
.background(color = Color.Yellow)
.align(Alignment.CenterStart), // stick to the left
contentAlignment = Alignment.TopStart
) {
Text("This should be within 40dp")
}
Column {
Spacer(modifier = Modifier.height(35.dp))
Text("2025.09.26",
modifier = Modifier
.border(1.dp, Color.Black, shape = RoundedCornerShape(15.dp))
.padding(5.dp)
)
Spacer(modifier = Modifier.height(30.dp))
}
}
}
Мое ожидаемое поведение - желтая область, которая должна быть показана с 40dp AS, но теперь он принимает полную вуза. Чтобы использовать FillMaxHeight вместо MatchParentSize , он действительно требует 40DP, но он требует более высокого размера вертикально,
выглядит как:
, но это может быть seethulation by by by by by br/> , но это может быть Seethulation. Столбец сестра < /code>,
мне было интересно любой другой подход более просты. Спасибо. Обязательно Whidth < /code>, безусловно, является правильным ответом на этот вопрос, спасибо за то, что научили меня этому! Это функция в моем проекте прямо сейчас: < /p>
Код: Выделить всё
@Composable
fun TimelineTagIndicator(
modifier: Modifier = Modifier,
strokeColorResId: Int = R.color.ai_widget_intelligent_plan_timeline_color,
strokeWidth: Dp = 1.1.dp,
strokePathEffect: PathEffect = PathEffect.dashPathEffect(floatArrayOf(6f, 6f)),
timelineColumnWidth: Dp = 40.dp,
isFirst: Boolean = false,
isLast: Boolean = false,
tagTopPadding: Dp = 15.dp,
tagBottomPadding: Dp = 10.dp,
content: @Composable () -> Unit
) {
Box(modifier = modifier.background(color = Color.Magenta)) {
var contentHeight by remember { mutableIntStateOf(0) }
var contentTopOffset by remember { mutableIntStateOf(0) }
val lineColor = colorResource(strokeColorResId)
val containerHeight = with(LocalDensity.current) {
contentHeight.toDp() + tagTopPadding + tagBottomPadding
}
Column(
modifier = Modifier
.width(timelineColumnWidth)
.height(containerHeight)
.background(color = Color.Yellow),
horizontalAlignment = Alignment.CenterHorizontally
) {
Canvas(
modifier = Modifier.fillMaxSize(),
) {
val strokeWidthPx = strokeWidth.toPx()
val centerX = size.width / 2
val startY = when {
isFirst -> contentTopOffset.toFloat() + contentHeight.toFloat()
isLast -> 0f
else -> 0f
}
val endY = when {
isLast -> contentTopOffset.toFloat()
else -> size.height
}
if (startY < endY) {
drawLine(
color = lineColor,
start = Offset(centerX, startY),
end = Offset(centerX, endY),
strokeWidth = strokeWidthPx,
pathEffect = strokePathEffect
)
}
}
}
Column {
Spacer(modifier = Modifier.height(tagTopPadding))
Box(
modifier = Modifier.onGloballyPositioned { coordinates ->
contentHeight = coordinates.size.height
contentTopOffset = coordinates.positionInParent().y.toInt()
}
) {
content()
}
Spacer(modifier = Modifier.height(tagBottomPadding))
}
}
}
Это то, что я хочу, но ноги. Теперь я хочу избавиться от вычислений, вместо этого использовать какой -то модификатор, чтобы справиться с трюком: < /p>
Код: Выделить всё
Column(
modifier = Modifier
.matchParentSize() // take the parent size
.requiredWidth(timelineColumnWidth) // set fixed width
.align(Alignment.TopStart)
.background(color = Color.Yellow),
horizontalAlignment = Alignment.Start
)
Затем я изменил запас контейнера на: br/>
. Затем я изменял запас контейнера на: br/>
. Затем я изменил контейнеру.
Код: Выделить всё
Box(modifier = modifier.background(color = Color.Magenta), contentAlignment = Alignment.TopStart) {Надеюсь, я смогу использовать от вас, гуру! Надеюсь, проблема и описание были вам ясны. Спасибо заранее!
Подробнее здесь: https://stackoverflow.com/questions/797 ... within-box
Мобильная версия