You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Glance Widget中的文本自动适配最大宽度?

Glance Widget文本适配问题与优化探讨

我正在开发Glance Widget,发现Text组件没有“适配宽度”的功能,用户手机的字体缩放设置会导致文本变得难以辨认。

大字体缩放(1.3倍)时的效果:
Fontscale 1.3

我希望在所有缩放级别下都能达到如下效果:
Fontscale 1.3 with autotextestimate

我尝试编写了如下临时解决方案,但我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:12:17