android - 如何从两个 Widget 组成一个新的 UI 元素?

标签 android android-jetpack android-jetpack-compose

Image 我在 Android 中有一个普通的按钮和一个星形图标。我想将它们组合成一个新的 Button 图标,其中的星星位于上角之一,如下所示:

enter image description here

当我使用 Row 时,两者是分开的。如您所见,星星应与按钮的一个角重叠。我该怎么做?

编辑:感谢我使用的 Gabriele Mariotti

Box {

    Button(
        id = "btnButton",
        modifier = Modifier
            .padding(end = 48)
        onClick = {
            //..
        }
    )

    IconWithStar(
        modifier = Modifier
            .scale(0.65f)
    )
}

星形图标绑定(bind)在左上角,我该如何修改?

最佳答案

您可以使用 Box 包裹可组合项,并使用 align/offset 修饰符来调整它们的位置。

Box(Modifier.padding(top=40.dp)){
    Button(
        onClick = {}) 
    {
        Text("Hello World")
    }
    Icon(
        Icons.Filled.Star, "",
        modifier =Modifier
            .align(TopEnd)
            .offset(12.dp,-12.dp),
        tint = Yellow600
    )
}

enter image description here

要获得更多控制权,您可以构建自定义布局
像这样的东西:

Layout( content = {

        Button(
            modifier = Modifier.layoutId("button"),
            onClick = { /* ... */ })
        {
            Text("Hello World")
        }
        Icon(Icons.Filled.Star, "",
            Modifier.layoutId("icon"),
            tint = Yellow600)
}){ measurables, incomingConstraints ->

    val constraints = incomingConstraints.copy(minWidth = 0, minHeight = 0)
    val buttonPlaceable =
        measurables.find { it.layoutId == "button" }?.measure(constraints)
    val iconPlaceable =
        measurables.find { it.layoutId == "icon" }?.measure(constraints)

    //align the icon on the top/end edge
    layout(width = widthOrZero(buttonPlaceable) + widthOrZero(iconPlaceable)/2,
        height = heightOrZero(buttonPlaceable)+ heightOrZero(iconPlaceable)/2){

        buttonPlaceable?.placeRelative(0, heightOrZero(iconPlaceable)/2)
        iconPlaceable?.placeRelative(widthOrZero(buttonPlaceable)- widthOrZero(iconPlaceable)/2,
           0)

    }
}


internal fun widthOrZero(placeable: Placeable?) = placeable?.width ?: 0
internal fun heightOrZero(placeable: Placeable?) = placeable?.height ?: 0

enter image description here

关于android - 如何从两个 Widget 组成一个新的 UI 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67263223/

相关文章:

android - 为什么我不能使用 `MutableState` 作为属性委托(delegate)?

android json unicode解析问题

android - 如何使用带有垂直居中菜单导航和操作的扩展高度工具栏?

java - 如何根据屏幕分辨率调整布局和 ScrollView 的大小

android - WorkManager 中如何减少 PeriodicWorkManager 的时间

android - 如何在 LazyColumn Jetpack Compose 中的项目之间添加分隔符?

java - 使用 whereArrayContains 搜索的效率

android - 如何在 Jetpack Compose 中传递条件参数?

android - 如何在 Android Jetpack Compose 中更改布局子项的绘制顺序?

android - 如何通过 UI 测试读取 Jetpack Compose TextField 的语义值?