在compose中使用.dp扩展函数之前是否需要将Int解析为dp?

问题描述 投票:0回答:1

假设我在figma中有一个分辨率为1080x1920的屏幕,然后我添加20px填充,当我用compose重新创建这个布局时,我需要将20解析为dp(使用一些实用函数,例如:val Int.dp: Int get() = (这个 * Resources.getSystem().displayMetrics.密度 + 0.5f).toInt()) 或者我可以只使用 20.dp 吗?

目前我只使用 .dp 扩展名,从来没有遇到过问题。

android kotlin android-layout android-jetpack-compose jetpack
1个回答
0
投票

您不必手动解析任何内容。如果您需要通过 Modifier 设置可组合项的填充、宽度或高度,那么使用 Dp 实现是最佳选择。但是,如果您需要在 Canvas 上绘制某些内容或进行一些低级布局测量,例如使用约束来定义 Offset,然后将 dp 转换为 px 值是可行的方法。这种转换可以通过使用

toPx()
toDp()
以及更多 Density 方法来完成。请记住,这些方法只能在密度上下文中访问。

这是使用 dp 进行填充的基本应用:

Text(
    modifier = Modifier.padding(horizontal = 16.dp),
    text = "This text has a horizontal padding of 16."
)

使用 dp 到 px 转换在 Canvas 上绘制正方形的示例:

Canvas(
    modifier = Modifier
        .width(200.dp)
        .height(100.dp),
    onDraw = {

        // Convert dp to px.
        val sqareSize = 50.dp.toPx()

        drawRect(
            color = Color.Blue,
            size = Size(
                width = squareSize,
                height = squareSize
            )
        )

    }
)

如果您需要在未提供密度上下文时转换值:

val spacing = with(LocalDensity.current) { 16.dp.toPx() }

SubcomposeLayout { constraints ->

    /// ...

    layout(
        width = constraints.maxWidth,
        height = constraints.maxHeight
    ) {

        /// ...

        val itemOffsetX = previousItemOffsetX + spacing

    }

    /// ...

}
© www.soinside.com 2019 - 2024. All rights reserved.