如何让Glance Widget中的文本自动适配最大宽度?
Glance Widget文本适配问题与优化探讨
我正在开发Glance Widget,发现Text组件没有“适配宽度”的功能,用户手机的字体缩放设置会导致文本变得难以辨认。
大字体缩放(1.3倍)时的效果:
我希望在所有缩放级别下都能达到如下效果:
我尝试编写了如下临时解决方案,但我的Android/Kotlin经验有限,想请教是否有更优的实现函数?
val Float.toPx get() = this * Resources.getSystem().displayMetrics.density fun autoSizeFont(text: String, availableWidthInPx: Int, fontSize: Float = 30.0F): TextUnit { val bounds = Rect() val paint = TextPaint() var fontSizeReturn = fontSize val scale = Resources.getSystem().configuration.fontScale while(true) { paint.textSize = (fontSizeReturn * Resources.getSystem().displayMetrics.density) //Try fontsize as sp paint.getTextBounds(text, 0, text.length, bounds) //In pixels if(availableWidthInPx >= bounds.width()) { fontSizeReturn /= scale //Remove scalefactor before returning fontSize return fontSizeReturn.sp } else { fontSizeReturn *= 0.95F //Did not fit, try 5% off } if(fontSizeReturn <= 0.0F) break } return TextUnit.Unspecified }
在组合函数中使用autoSizeFont()的示例如下:
@Composable fun Widget(text: String) { val defaultWeight = GlanceModifier.fillMaxWidth() val size = LocalSize.current Text( text = weatherInfo.header, style = TextStyle( fontSize = autoSizeFont(text, size.width.value.toPx.toInt()), textAlign = TextAlign.Center ), modifier = defaultWeight, maxLines = 1 ) }
如果您有Glance Widget布局适配各类缩放和尺寸的经验,欢迎分享技巧,比如是否可以像Flutter一样强制fontScale=1.0,或其他实现方法。
内容的提问来源于stack exchange,提问作者Large
相关产品推荐
相关产品推荐

