Kotlin Multiplatform通用层中如何实现Dp与Pixels的转换?
Compose 通用层中Dp与Px的优雅转换方案
在Compose里搞Dp和Px转换,通用层拿不到LocalDensity确实头疼,不用写平台特定函数的话,这几个方案够实用:
传递Density实例到通用层
UI层能轻松拿到LocalDensity.current,初始化通用层的逻辑类或工具类时直接把这个实例传过去就行,通用层就可以用它来做单位转换了。
代码示例:// UI层调用通用逻辑 @Composable fun MainScreen() { val density = LocalDensity.current val converter = DensityConverter(density) val pxValue = converter.dpToPx(16.dp) } // 通用层的转换类 class DensityConverter(private val density: Density) { fun dpToPx(dp: Dp): Float = dp.toPx(density) fun pxToDp(px: Float): Dp = px.toDp(density) }封装基于Density的扩展函数
可以在通用层写一套扩展函数,把Density作为参数传入,这样转换的时候更简洁:// 通用层的扩展函数 fun Dp.toPx(density: Density): Float = this.value * density.density fun Float.toDp(density: Density): Dp = Dp(this / density.density) fun Int.toDp(density: Density): Dp = toFloat().toDp(density)用的时候只要拿到Density实例,直接调用就行:
16.dp.toPx(density)通过依赖注入传递Density
如果项目用了依赖注入框架(比如Hilt),可以在UI层把LocalDensity.current注入到容器里,通用层直接从容器获取Density实例,不用手动传参,适合大型项目:// 在UI层提供Density实例 @Module @InstallIn(SingletonComponent::class) object DensityModule { @Provides fun provideDensity(@ApplicationContext context: Context): Density { return Density(context.resources.displayMetrics.density) } } // 通用层直接注入使用 class CommonRepository @Inject constructor(private val density: Density) { fun calculateSize(dp: Dp): Float { return dp.toPx(density) } }
内容的提问来源于stack exchange,提问作者Andrei Naumets
相关产品推荐
相关产品推荐

