开发者-钟大田 2022-08-25 16:08 采纳率: 100%
浏览 13
已结题

Compose 的 ConstraintLayout 约束问题

Compose 的 ConstraintLayout 约束问题
代码如下
@Preview(showBackground = true)
@Composable
fun ToolBarWidget(
    @PreviewParameter(ToolBarParamsMock::class) params: ToolBarParams
) {
    ConstraintLayout(
        modifier = Modifier
            .fillMaxWidth()
            .height(45.dp)
    ) {

        val (leftIcon, title, rightText, rightIcon) = createRefs()

        Image(
            painter = painterResource(id = R.drawable.icon_arrow_left),
            contentDescription = "backIcon",
            modifier = Modifier
                .constrainAs(leftIcon) {
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                }
                .padding(16.dp, 0.dp, 0.dp, 0.dp)
                .clickable {
                    params.backClick?.invoke()
                },
            alignment = Alignment.Center
        )

        Text(
            params.titleText,
            textAlign = TextAlign.Center,
            maxLines = 1,
            overflow = TextOverflow.Ellipsis,
            modifier = Modifier
                .fillMaxWidth(1f)
                .constrainAs(title) {
                    linkTo(
                        start = parent.start, startMargin = 48.dp,
                        end = parent.end, endMargin = 45.dp,
                        top = parent.top, topMargin = 0.dp,
                        bottom = parent.bottom, bottomMargin = 0.dp
                    )
                }


        )

        params.rightText?.let {
            Text(
                it,
                textAlign = TextAlign.Center,
                modifier = Modifier.constrainAs(rightText) {
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                }
            )
        }

        params.rightIcon?.let {
            Image(
                painter = painterResource(id = it),
                contentDescription = "rightIcon",
                modifier = Modifier
                    .constrainAs(rightIcon) {
                        top.linkTo(parent.top)
                        bottom.linkTo(parent.bottom)
                    }
                    .padding(16.dp, 0.dp, 0.dp, 0.dp),
            )
        }
    }
}

data class ToolBarParams(
    val titleText: String,
    val rightText: String?,
    val rightIcon: Int?,
    val backClick: (() -> Unit)?
)

class ToolBarParamsMock : PreviewParameterProvider<ToolBarParams> {
    override val values: Sequence<ToolBarParams>
        get() = listOf<ToolBarParams>(
            ToolBarParams("标题", "右标题", null, null),
            ToolBarParams(
                "标题".repeat(40),
                null,
                R.drawable.icon_arrow_left,
                null
            ),
            ToolBarParams("标题", null, null, null)
        ).asSequence()
}
预览结果如下

img

我的疑问

为什么标题的视图的宽度不是margin start 和 margin end 约束下的大小,居然可以撑大到parent。我希望是撑大到约束。
我进行了

        Text(
            params.titleText,
            textAlign = TextAlign.Center,
            maxLines = 1,
            overflow = TextOverflow.Ellipsis,
            modifier = Modifier
                .constrainAs(title) {
                    linkTo(
                        start = parent.start, startMargin = 48.dp,
                        end = parent.end, endMargin = 45.dp,
                        top = parent.top, topMargin = 0.dp,
                        bottom = parent.bottom, bottomMargin = 0.dp
                    )
                }
        )

在android xml 中我们可以设置宽度为0dp实现效果
尝试也不行

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 8月30日
    • 修改了问题 8月25日
    • 创建了问题 8月25日

    悬赏问题

    • ¥15 2020长安杯与连接网探
    • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
    • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
    • ¥16 mybatis的代理对象无法通过@Autowired装填
    • ¥15 可见光定位matlab仿真
    • ¥15 arduino 四自由度机械臂
    • ¥15 wordpress 产品图片 GIF 没法显示
    • ¥15 求三国群英传pl国战时间的修改方法
    • ¥15 matlab代码代写,需写出详细代码,代价私
    • ¥15 ROS系统搭建请教(跨境电商用途)