在 Jetpack Compose 中,可以轻松地将密度无关的像素(dp)转换为屏幕像素(px)。这对于构建响应式 UI 非常有用,因为它可以使在不同的屏幕密度和大小上保持一致的布局和元素大小。
Jetpack Compose 中的 Density
接口定义了 toPx()
和 roundToPx()
方法来将 dp 转换为 px。
所以我们可以使用 LocalDensity
来调用它们,它提供与当前屏幕密度相关的信息。
dp 转换为 px
下面是将 dp 转换为 px 的示例代码:
@Composable
fun dpToPx(dp: Dp) = with(LocalDensity.current) { dp.toPx() }
上面的代码中,我们首先获取当前屏幕密度,然后使用 toPx()
将 dp 转换为 px。
或者使用另一种写法,使用作用域函数 run
@Composable
fun dpToPx(dp: Dp) = LocalDensity.current.run { dp.toPx() }
px 转换为 dp
跟上面 dp 转换为 px 相同,通过 Density
接口的 toDp()
方法
@Composable
fun pxToDp(px: Int) = with(LocalDensity.current) { px.toDp() }
// 或者
@Composable
fun pxToDp(px: Int) = LocalDensity.current.run { px.toDp() }
sp 转换为 px 或 dp
跟上面类似:
@Composable
fun spToDp(sp: TextUnit) = with(LocalDensity.current) { sp.toDp() }
@Composable
fun spToPx(sp: TextUnit) = with(LocalDensity.current) { sp.toPx() }