Compose中Dp和Sp的适配

1,185 阅读1分钟

Compose中的Dp和Sp如何适配呢?目前想到的做法是依照px为参照从而实现适配。 项目中的设计图的宽度通常是750,字号为15的,实际对应的px为30,间隔15的,实际对应的也是30,那这里就想到计算实际手机的宽度,然后通过比例算出在实际手机中应该展示的px值,最后再将px回转成sp或者dp,从而达到适配效果。 下面就直接上代码了:

@Composable
fun Int.nsp():TextUnit {
    return getRealDp(LocalContext.current,this.toDouble(),isDp = false).sp
}

@Composable
fun Float.nsp():TextUnit {
    return getRealDp(LocalContext.current,this.toDouble(),isDp = false).sp
}

@Composable
fun Double.nsp():TextUnit {
    return getRealDp(LocalContext.current,this,isDp = false).sp
}

@Composable
fun Int.ndp():Dp {
    return getRealDp(LocalContext.current,this.toDouble()).dp
}

@Composable
fun Float.ndp():Dp {
    return getRealDp(LocalContext.current,this.toDouble()).dp
}

@Composable
fun Double.ndp():Dp {
    return getRealDp(LocalContext.current,this).dp
}

private fun getRealDp(context:Context,value:Double,isDp:Boolean=true):Double {
    val density=if(isDp) context.resources.displayMetrics.density else context.resources.displayMetrics.scaledDensity
    val screenWidth=context.resources.displayMetrics.widthPixels
    return ((screenWidth/750.0)*2*value/density)
}

在setContent中加入测试代码

Column {
    Text(text = "哈哈哈哈",fontSize = 15.nsp())
    Spacer(modifier = Modifier.height(15.0.ndp()))
    Text(text = "啦啦啦啦",fontSize = 15.0.sp)
    Spacer(modifier = Modifier.height(15.0.dp))
    Text(text = "哈哈哈哈哈",fontSize = 15.0.nsp())
}

image.png

“啦啦啦啦” 因为是使用了原始的sp,在系统字体改变之后,它也会改变。如果用nsp()扩展方法则不受系统字体变化影响