Как политика измерения Layout Composable измеряет дочерний элемент с использованием родительских ограничений?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как политика измерения Layout Composable измеряет дочерний элемент с использованием родительских ограничений?

Сообщение Anonymous »

Я пытаюсь создать собственный макет, чтобы понять, как он работает, а также разместить и измерить его дочерние составные элементы. Если я устанавливаю размер своего пользовательского составного объекта, а затем измеряю дочерний элемент в области измерения макета, дочерний элемент должен иметь ширину и высоту, равные максимальной ширине и высоте родителя:

Код: Выделить всё

@Composable
fun CustomComposable(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
Layout(
modifier = modifier,
content = content,
measurePolicy = { measurables, constraints ->
val placeables = measurables.map {
it.measure(constraints)
}

layout(constraints.maxWidth, constraints.maxHeight) {
var y = 0
placeables.forEach {
it.place(0, y)
y += (it.height)
}
}
},
)
}
Я использую это следующим образом:

Код: Выделить всё

CustomComposable(
modifier = Modifier
.size(200.dp)
.background(color = Color.Red)
) {
Text(text = "Text 1", modifier = Modifier.size(20.dp))
Text(text = "Text 2", modifier = Modifier.size(20.dp))
}
Вывод приведенного выше кода:
Изображение
Когда я не устанавливаю размер, дочерние элементы располагаются в соответствии с необходимой им шириной и высотой, но родительский элемент размещается в полноэкранном режиме:

Код: Выделить всё

CustomComposable(
modifier = Modifier.background(color = Color.Red)
) {
Text(text = "Text 1")
Text(text = "Text 2")
}
Если для родительского элемента не установлен размер:
Изображение
Я хочу понять это поведение (почему это происходит, как я могу добиться, чтобы родительский элемент уважал свои ограничения, и если я устанавливаю размер дочернего элемента, он соблюдается, а если нет, то это занимает столько места, сколько ему нужно, до тех пор, пока ему не будет приказано соответствовать своему родительскому элементу, как в примере ниже) и как это обрабатывается в других составных объектах? Нравится эта колонка:

Код: Выделить всё

Column(
modifier = Modifier
.fillMaxSize()
.background(color = Color.Red)
) {
Text(text = "this is 1", modifier = Modifier.size(20.dp))
Text(text = "this is 2")
}
Как сделать что-то подобное на этих изображениях:
  • Слева: столбец с собственным размером в виде максимальной ширины заполнения и его размер имеет свой собственный размер
  • Справа: столбец без указания размера, но дочерний элемент со своим собственным размером
Изображение
Изображение
И последний вопрос: если мы передаем размер в CustomComposable и изменим его ширину и высоту в макете (newWidth, newHeight) {, изменятся ли размеры макета? Если нет, то есть ли смысл рассчитывать вручную? Как и всякий раз, когда кто-то отправляет его, будет установлен только указанный размер.

Подробнее здесь: https://stackoverflow.com/questions/784 ... constraint
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»