
Modifier
Cпособ изменить или дополнить поведение и внешний вид UI-компонентов (Composable). С помощью Modifier можно задавать размеры, отступы, фон, обработку жестов, анимации и многое другое, без изменения самого компонента. Это позволяет легко комбинировать и переиспользовать стили и эффекты для разных элементов.
• Последовательность применения: Modifier применяются слева направо, то есть порядок важен.
then
Позволяет объединять несколько Modifier в один. Она полезна для создания цепочек модификаторов, так как позволяет добавлять или комбинировать дополнительные модификаторы, сохраняя порядок их применения.
val isClickable = true
val modifier = Modifier
.padding(16.dp)
.then(if (isClickable) Modifier.clickable { /* обработка клика */ } else Modifier)Size
width(width: Dp)
Задает фиксированную ширину для компонента.
@Composable
fun FixedWidthBox() {
Box(
modifier = Modifier.width(100.dp)
)
}height(height: Dp)
Задает фиксированную высоту для компонента.
@Composable
fun FixedHeightBox() {
Box(
modifier = Modifier.height(100.dp)
)
}size(size: Dp)
Задает фиксированный размер (ширину и высоту) для компонента.
@Composable
fun SquareBox() {
Box(
modifier = Modifier.size(100.dp)
)
}size(width: Dp, height: Dp)
Задает фиксированную ширину и высоту для компонента, используя разные значения для каждой из них.
@Composable
fun RectangleBox() {
Box(
modifier = Modifier.size(width = 120.dp, height = 60.dp)
)
}size(size: DpSize)
Позволяет установить ширину и высоту компонента с помощью объекта DpSize.
@Composable
fun RectangleBox() {
val boxSize = DpSize(width = 120.dp, height = 60.dp)
Box(
modifier = Modifier.size(boxSize)
)
}widthIn(min: Dp, max: Dp)
Задает минимальную и максимальную ширину для компонента.
@Composable
fun LimitedWidthBox() {
Box(
modifier = Modifier.widthIn(min = 100.dp, max = 200.dp)
)
}heightIn(min: Dp, max: Dp)
Задает минимальную и максимальную высоту для компонента.
@Composable
fun LimitedHeightBox() {
Box(
modifier = Modifier.heightIn(min = 100.dp, max = 200.dp)
)
}sizeIn(minWidth: Dp, minHeight: Dp, maxWidth: Dp, maxHeight: Dp)
Задает минимальный и максимальный размер (ширину и высоту) для компонента.
@Composable
fun LimitedSizeBox() {
Box(
modifier = Modifier.sizeIn(minWidth = 100.dp, minHeight = 50.dp, maxWidth = 200.dp, maxHeight = 100.dp)
)
}requiredWidth(width: Dp)
Устанавливает фиксированную ширину для компонента, независимо от других модификаторов. В отличие от width, который может быть переопределен другими модификаторами (например, widthIn или sizeIn), requiredWidth устанавливает фиксированную ширину, которая игнорирует любые другие ограничения.
@Composable
fun RequiredWidthBox() {
Box(
modifier = Modifier.requiredWidth(150.dp)
)
}requiredHeight(height: Dp)
Устанавливает фиксированную высоту для компонента, независимо от других модификаторов. В отличие от height, который может быть переопределен другими модификаторами (например, heightIn или sizeIn), requiredHeight устанавливает фиксированную высоту, которая игнорирует любые другие ограничения.
@Composable
fun RequiredHeightBox() {
Box(
modifier = Modifier.requiredHeight(100.dp)
)
}requiredSize(size: Dp)
Устанавливает фиксированный размер (ширину и высоту) для компонента, независимо от других модификаторов. В отличие от size, который может быть переопределен другими модификаторами (например, sizeIn), requiredSize устанавливает фиксированный размер, который игнорирует любые другие ограничения.
@Composable
fun RequiredSizeBox() {
Box(
modifier = Modifier.requiredSize(100.dp)
)
}requiredSize(width: Dp, height: Dp)
Устанавливает фиксированную ширину и высоту для компонента, независимо от других модификаторов. В отличие от size, который может быть переопределен другими модификаторами (например, sizeIn), requiredSize устанавливает фиксированный размер, который игнорирует любые другие ограничения.
@Composable
fun RequiredSizeBox() {
Box(
modifier = Modifier.requiredSize(width = 120.dp, height = 80.dp)
)
}requiredWidthIn(min: Dp, max: Dp)
Задает обязательные минимальную и максимальную ширину для компонента. В отличие от widthIn, который может быть переопределен другими модификаторами, requiredWidthIn устанавливает строгие ограничения по ширине, которые не могут быть изменены другими модификаторами.
@Composable
fun RequiredWidthInBox() {
Box(
modifier = Modifier.requiredWidthIn(min = 100.dp, max = 200.dp)
)
}requiredHeightIn(min: Dp, max: Dp)
Задает обязательные минимальную и максимальную высоту для компонента. В отличие от heightIn, который может быть переопределен другими модификаторами, requiredHeightIn устанавливает строгие ограничения по высоте, которые не могут быть изменены другими модификаторами.
@Composable
fun RequiredHeightInBox() {
Box(
modifier = Modifier.requiredHeightIn(min = 50.dp, max = 150.dp)
)
}requiredSizeIn(minWidth: Dp, minHeight: Dp, maxWidth: Dp, maxHeight: Dp)
Задает обязательные минимальные и максимальные значения как для ширины, так и для высоты компонента. В отличие от sizeIn, который может быть переопределен другими модификаторами, requiredSizeIn устанавливает строгие ограничения по ширине и высоте, которые не могут быть изменены другими модификаторами.
@Composable
fun RequiredSizeInBox() {
Box(
modifier = Modifier.requiredSizeIn(minWidth = 100.dp, minHeight = 50.dp, maxWidth = 200.dp, maxHeight = 100.dp)
)
}fillMaxWidth(fraction: Float)
Заставляет компонент занять определенную долю доступной ширины родительского контейнера.
• fraction определяет долю ширины, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакой ширины, а 1.0 — что он займет всю доступную ширину. Значение по умолчанию — 1.0, то есть компонент будет занимать всю ширину контейнера. fraction = 0.5F означает, что компонент займет 50% доступной ширины контейнера.
@Composable
fun FullWidthBox() {
Box(
modifier = Modifier.fillMaxWidth()
)
}@Composable
fun HalfWidthBox() {
Box(
modifier = Modifier.fillMaxWidth(fraction = 0.5F)
)
}fillMaxHeight(fraction: Float)
Заставляет компонент занять определенную долю доступной высоты родительского контейнера.
• fraction определяет долю высоты, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакой высоты, а 1.0 — что он займет всю доступную высоту контейнера. Значение по умолчанию — 1.0, то есть компонент будет занимать всю высоту контейнера. fraction = 0.5F означает, что компонент займет 50% доступной высоты контейнера.
@Composable
fun FullHeightBox() {
Box(
modifier = Modifier.fillMaxHeight()
)
}@Composable
fun HalfHeightBox() {
Box(
modifier = Modifier.fillMaxHeight(0.5F)
)
}fillMaxSize(fraction: Float)
Заставляет компонент занять определенную долю доступного пространства как по ширине, так и по высоте родительского контейнера.
• fraction определяет долю ширины и высоты, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакого пространства, а 1.0 — что он займет всю доступную ширину и высоту контейнера. Значение по умолчанию — 1.0, то есть компонент будет занимать все доступное пространство. fraction = 0.5F означает, что компонент займет 50% ширины и 50% высоты родительского контейнера.
@Composable
fun FullSizeBox() {
Box(
modifier = Modifier.fillMaxSize()
)
}@Composable
fun HalfSizeBox() {
Box(
modifier = Modifier.fillMaxSize(0.5F)
)
}wrapContentWidth(align: Alignment.Horizontal, unbounded: Boolean)
Заставляет компонент занимать минимально возможную ширину, необходимую для отображения его содержимого. В отличие от fillMaxWidth, который заполняет всю доступную ширину, wrapContentWidth позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать горизонтальное выравнивание и поведение за пределами ограничений.
• align определяет горизонтальное выравнивание компонента внутри доступного пространства. Это значение задается с помощью Alignment.Horizontal, и может быть, например, Alignment.Start, Alignment.CenterHorizontally или Alignment.End. Оно управляет тем, как компонент будет выровнен внутри выделенной ему ширины, если доступное пространство больше минимально необходимого.
• unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по ширине. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, текст может выходить за пределы экрана). Обычно этот параметр оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.
@Composable
fun WrapContentWidthBox() {
Box(
modifier = Modifier.wrapContentWidth(align = Alignment.CenterHorizontally, unbounded = false)
)
}wrapContentHeight(align: Alignment.Vertical, unbounded: Boolean)
Заставляет компонент занимать минимально возможную высоту, необходимую для отображения его содержимого. В отличие от fillMaxHeight, который заполняет всю доступную высоту, wrapContentHeight позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать вертикальное выравнивание и поведение за пределами ограничений.
• align определяет вертикальное выравнивание компонента внутри доступного пространства. Это значение задается с помощью Alignment.Vertical, и может быть, например, Alignment.Top, Alignment.CenterVertically или Alignment.Bottom. Выравнивание управляет тем, как компонент будет располагаться внутри выделенной ему высоты, если доступное пространство больше минимально необходимого.
• unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по высоте. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, длинный текст может выходить за пределы контейнера). Обычно unbounded оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.
@Composable
fun WrapContentHeightBox() {
Box(
modifier = Modifier.wrapContentHeight(align = Alignment.CenterVertically, unbounded = false)
)
}wrapContentSize(align: Alignment, unbounded: Boolean)
Заставляет компонент занимать минимально возможный размер (ширину и высоту), необходимый для отображения его содержимого. В отличие от fillMaxSize, который заполняет все доступное пространство, wrapContentSize позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать выравнивание и поведение за пределами ограничений как по ширине, так и по высоте.
• align определяет выравнивание компонента внутри доступного пространства. Использует объект Alignment, который задает как горизонтальное, так и вертикальное выравнивание. Примеры значений: Alignment.TopStart, Alignment.Center, Alignment.BottomEnd и другие. Это позволяет расположить компонент в нужной позиции, если доступное пространство больше, чем минимально необходимое.
• unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по размеру. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, текст может выйти за пределы контейнера). Обычно unbounded оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.
@Composable
fun WrapContentSizeBox() {
Box(
modifier = Modifier.wrapContentSize(align = Alignment.Center, unbounded = false)
)
}defaultMinSize(minWidth: Dp, minHeight: Dp)
Устанавливает минимальные размеры (ширину и/или высоту) для компонента, если его содержимое занимает меньше места, чем указанные значения. В отличие от модификаторов вроде requiredSize, defaultMinSize применяется только тогда, когда содержимое компонента меньше минимальных размеров, и не заставляет компонент всегда занимать это пространство. Этот модификатор удобен, когда нужно задать минимальные размеры для компонента, но при этом оставить его адаптивным, если содержимое занимает больше места.
@Composable
fun DefaultMinSizeBox() {
Box(
modifier = Modifier.defaultMinSize(minWidth = 100.dp, minHeight = 50.dp)
)
}Вопросы на собесе (1)
- В чем особенность Modifier?
Каждый вызов модификатора возвращает новый объект, что способствует декларативному стилю разработки и позволяет легко комбинировать несколько модификаторов, а также наследовать их. Порядок операторов также имеет значение.