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?
Каждый вызов модификатора возвращает новый объект, что способствует декларативному стилю разработки и позволяет легко комбинировать несколько модификаторов, а также наследовать их. Порядок операторов также имеет значение.