KMM_Compose 获取当前容器或父视图的尺寸size

获取当前容器或父视图的尺寸可以使用 onGloballyPositioned,不过拿到的是像素点。

var containerSize by remember { mutableStateOf(IntSize.Zero) }
println("momo: container size = ${containerSize}")
Box(
	modifier = Modifier
		.background(color = Color.Red)
		.fillMaxSize()
		.onGloballyPositioned {
			// 这里拿到尺寸后会刷新当前视图
			containerSize = it.size // 这里拿到的是像素!! pixel
		},
		contentAlignment = Alignment.Center
	) {
		Box(
			modifier = Modifier
				.background(color = Color.Blue)
				// 蓝色方块设置为 父视图红色方块 的 1/4 大小
				.width((containerSize.width / 2).pxToDp())
				.height((containerSize.height / 2).pxToDp())
		) {
			// display some compose
		}
	}

将像素点转化为 dp,因双端接口不一致,所以需要分别实现:

commonMain 里声明统一的接口:

/**
 * dp 转 pixel
 */
internal expect fun dpToPx(dp: Float): Float

/**
 * piexl 转 dp
 */
internal expect fun pixelToDp(pixel: Float): Float

iOSMain 里的实现:

import platform.UIKit.UIScreen

internal actual fun dpToPx(dp: Float): Float {
    val scale = UIScreen.mainScreen().scale.toFloat()
    return dp * scale
}
internal actual fun pixelToDp(pixel: Float): Float {
    val scale = UIScreen.mainScreen().scale.toFloat()
    return pixel / scale
}

androidMain 里的实现:

import android.content.res.Resources

internal actual fun dpToPx(dp: Float): Float {
    val density = Resources.getSystem().displayMetrics.density
    return dp * density + 0.5f
}

internal actual fun pixelToDp(pixel: Float): Float {
    val density = Resources.getSystem().displayMetrics.density
    return pixel / density + 0.5f
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小莫同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值