kotlin 重叠双盒喷气背包组成

qybjjes1  于 2023-10-23  发布在  Kotlin
关注(0)|答案(6)|浏览(169)

我试图重叠两个Box,或者在这种情况下使用Row更好。
我的设计是一个Row与另一个重叠,我把它 Package 在一个Column上,对吗?
这是设计,我想有什么是顶部的矩形是下面的一个相同的大小,然后移动它一些像素,你可以在图像中看到,但他们应该有相同的宽度,但不相同的高度。

如果层次结构是:

Column 
  Box (the one of the top)
    Row
  Box (the one of the bottom)
    Row (inside there is text and it's all the same align)

......

w1jd8yoj

w1jd8yoj1#

几天前我遇到了这个问题,我用ConstraintLayout解决了它。
我要做的是:
1.将implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-beta02"添加到build.gradle
1.将每个Box Package 在ConstraintLayout { .. }
1.在每个Box内添加Modifier.constrainAs,以根据需要对齐TopBottomStartEnd
1.如果你想让第一个盒子和第二个盒子的width相同,而不硬编码dps,你应该使用width = Dimension.fillToConstraints
fillToConstraints -布局将扩展以填充由其约束在该维中定义的空间。
没有硬编码的基本示例:

ConstraintLayout() {
            val (title, description) = createRefs()
            Box(
                modifier = Modifier
                    .padding(start = 28.dp)
                    .background(color = Red)
                    .padding(
                        horizontal = 16.dp,
                    )
                    .constrainAs(title) {
                        top.linkTo(parent.top)
                        start.linkTo(parent.start)
                        end.linkTo(parent.end)
                        width = Dimension.fillToConstraints
                    }
            ) {
                Text(text = "Hello World")
            }

            Box(
                modifier = Modifier
                    .padding(end = 4.dp)
                    .background(Color.Magenta)
                    .padding(bottom = 5.dp, start = 8.dp, end = 16.dp, top = 4.dp)
                    .constrainAs(description) {
                        top.linkTo(title.top, margin = 16.dp)
                        start.linkTo(parent.start)
                        end.linkTo(parent.end)
                        bottom.linkTo(parent.bottom)
                    }
            ) {
                Text(text = "Skizo-ozᴉʞS rules")
            }
        }

现在你必须根据你的UI来使用padding并适应它,结果是这样的:

o0lyfsai

o0lyfsai2#

这是使用BoxWithConstraints的方式,而不是使用固定的宽度和高度:

BoxWithConstraints(
    Modifier
        .background(color = Color.Blue)
        .padding(20.dp)) {

    val boxWidth = this.maxWidth
    Box(
        modifier = Modifier
            .width(boxWidth - 10.dp)
            .background(Color.Red)
    ) {
        Text(text = "Hello Android")
    }
    Column() {
        Spacer(modifier = Modifier
            .height(10.dp)
            .width(10.dp))
        Row( ) {
            Spacer(modifier = Modifier.width(10.dp))
            Box(
                modifier = Modifier
                    .width(boxWidth)
                    .zIndex(2f)
                    .background(Color.Yellow)
            ) {
                Text("aa", modifier = Modifier.background(color = Color.Green))
            }
        }
    }
}

3zwjbxry

3zwjbxry3#

为了使Composables重叠,您应该将它们放在同一个Box中。试试这个:

Box(modifier = Modifier.size(width = 300.dp, height = 100.dp)) {
    Row(modifier = Modifier
        .size(width = 200.dp, height = 50.dp)
        .background(color = Color.Blue)
        .align(Alignment.TopEnd)) {}
    Row(modifier = Modifier
        .size(width = 200.dp, height = 70.dp)
        .background(color = Color.Red)
        .align(Alignment.BottomStart)) {}
}
lo8azlld

lo8azlld4#

你可以用很多方法来实现这一点,

@Composable
fun BoxOverBox() {
    Box(
        modifier = Modifier.fillMaxSize()
            .background(Color.White),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier
                .width(200.dp)
                .height(50.dp)
                .background(Color.Red)
        )
        Box(
            modifier = Modifier
                .width(200.dp)
                .height(50.dp)
                .zIndex(2f)
                .graphicsLayer {
                    translationX = -50f
                    translationY = 50f
                }
                .background(Color.Blue)
        )
    }
}
1hdlvixo

1hdlvixo5#

我认为你必须使用“matchParentSize”修饰符,它在BoxScope中是可用的,我的意思是在Box composable中,当它第一次加入composable以将相同的大小应用于自己时,修饰符测量除自己之外的其他子大小。
您可以在文档https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/BoxScope#(androidx. composite.ui.Modifier)中看到此修饰符。matchParentSize()

igsr9ssn

igsr9ssn6#

要让两个盒子或任何其他组合以这种方式重叠,您可以使用spacedBy方法进行排列,无论是在Row还是Column上,并传递负值Android docs也支持此功能。
举例来说:

fun OverlappingBoxesPreview() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.padding(20.dp),
        verticalArrangement = Arrangement.spacedBy((-30).dp),
    ) {
        Box(
            modifier = Modifier
                .size(100.dp)
                .background(Color.Red),
        )

        Box(
            modifier = Modifier
                .size(80.dp)
                .background(Color.Green),
        )

    }
}

将产生:

相关问题