Направляющие линии guildeline

Последнее обновление: 07.04.2024

Направляющие линии guildelines в ConstraintLayout предоставляют горизонтальную или вертикальную опорную линию, относительно которой могут позиционироваться компоненты. Это может использоваться, когда группу компонентов необходимо выровнять относительно определенной линии оси. Положение направляющей может быть объявлено в процентах от высоты или ширины родительского контейнера или расположено с определенным смещением от определенной стороны:

  • createGuidelineFromAbsoluteLeft(): создает направляющую линию от левой стороны контейнера

  • createGuidelineFromAbsoluteRight(): создает направляющую линию от правой стороны контейнера

  • createGuidelineFromBottom(): создает направляющую линию от нижней стороны контейнера

  • createGuidelineFromTop(): создает направляющую линию от верхней стороны контейнера

  • createGuidelineFromStart(): создает направляющую линию от начала контейнера

  • createGuidelineFromEnd(): создает направляющую линию от конца контейнера

Все эти функции имеют две версии. Одна принимает параметр fraction - значение Float от 0.0 до 1.0, который представляет долю от направляющей до соответствующей стороны контейнера. Вторая версия принимает параметр offset - отступ в пикселях (Dp) между направляющей и соответствующей стороны контейнера.

Так, в следующем примере создается направляющая, которая расположена на 60% от начальной стороны контейнера (левой стороны при левосторонней ориентации):

package com.example.helloapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent{
            ConstraintLayout(Modifier.fillMaxSize()) {
                val (box1, box2, box3) = createRefs()
                val guide = createGuidelineFromStart(fraction = .60f)
                Box(Modifier.size(120.dp).background(Color.DarkGray).constrainAs(box1) {
                    top.linkTo(parent.top, margin = 30.dp)
                    end.linkTo(guide)
                })
                Box(Modifier.size(120.dp).background(Color.Red).constrainAs(box2) {
                    top.linkTo(box1.bottom, margin = 20.dp)
                    start.linkTo(guide, margin = 40.dp)
                })
                Box(Modifier.size(120.dp).background(Color.Blue).constrainAs(box3) {
                    top.linkTo(box2.bottom, margin = 40.dp)
                    end.linkTo(guide, margin = 60.dp)
                })
            }
        }
    }
}

Вначале создаем направляющую и сохраняем ссылку на нее в переменную guide:

val guide = createGuidelineFromStart(fraction = .60f)

Далее используем эту направляющую для установки ограничений. Например, для компонента Box с ссылкой box1 по направляющей определяется конечная сторона (правая сторона при левосторонней ориентации)

end.linkTo(guide)

Та же сторона определяется и для компонента box3, только добавляется отступ в 60 пикселей влево:

end.linkTo(guide, margin = 60.dp)

А для box2 по направляющей guide определяется начальная сторона:

start.linkTo(guide, margin = 40.dp)

То есть направляющая guide выступает в качестве оси, вокруг которой расположены компоненты.

ConstraintLayout и guide в Jetpack Compose на Kotlin на Android

Аналогично можно было бы использовать смещение для образования направляющей линии, например, линия со смещением на 200 пикселей от начальной стороны контейнера:

val guide = createGuidelineFromStart(offset = 200.dp)
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850