Android Compose textSize的em单位定义、与sp/dp区别及转换方法
Android Compose textSize 单位相关问题解答
1. 什么是em单位?
em是排版领域通用的相对长度单位,在Compose中1em等价于当前上下文继承到的字体大小。如果上层没有自定义字体大小,默认基准为Android系统默认字体大小,通常为16sp。设置1.5em就意味着最终显示的字体大小是当前基准大小的1.5倍。
2. em、sp、dp三者有什么区别,为什么textSize不支持dp单位?
三者核心区别:
- dp(密度无关像素):仅和设备屏幕像素密度挂钩,相同dp值在不同密度设备上的物理尺寸接近,不受系统字体缩放设置影响,一般用于布局宽高、边距等非文字类尺寸定义。
- sp(可缩放像素):Android专为字体设计的单位,同时适配屏幕密度和系统字体缩放等级,用户在系统设置中调大/调小字体时,sp单位的字体也会同步缩放,是Android官方推荐的默认字体单位。
- em:相对比例单位,值完全取决于当前组件继承的父级字体大小,适合做同上下文内的字体相对比例调整,比如要让某段注释文字比正文小一半,直接设置0.5em即可,不需要关心正文的具体sp值。
为什么textSize不支持dp单位:
Android官方无障碍规范明确要求,应用字体需要支持跟随系统字体缩放调整,方便视力不佳的用户使用。如果允许用dp设置字体大小,字体大小就会固定死,不会响应用户的字体缩放设置,严重影响无障碍体验。Compose在设计Text的fontSize参数时,直接从类型层面限制了仅接受TextUnit类型的em、sp单位传入,从根源上避免开发者误用dp作为字体单位。
3. 如何从其他单位转换为em单位?
em是相对单位,转换前必须先确定当前上下文的基准字体大小:
如果是固定场景,比如你已经明确当前基准字体为16sp,想要达到32sp的显示效果,直接计算32/16=2,设置2.em即可。
如果是需要动态适配不同基准的场景,可以通过LocalTextStyle拿到当前继承的字体大小做计算,示例代码如下:
// 固定值设置em Text(text = "Hello",fontSize = 5.em) // 动态从sp转em的示例 val baseFontSize = LocalTextStyle.current.fontSize val targetSpValue = 24.sp val emValue = (targetSpValue / baseFontSize).em Text(text = "动态转换的文本", fontSize = emValue)
内容的提问来源于stack exchange,提问作者Александр Щербаков
相关产品推荐
相关产品推荐

