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

Jetpack Compose中如何在Canvas里居中显示文本?

Jetpack Compose Canvas 实现文本居中显示

你当前的代码是把文本的左上角定位在Canvas中心,导致文本整体偏右下,无法实现真正的居中。要解决这个问题,需要先测量文本的实际宽高,再计算出让文本居中的偏移量。

以下是修改后的完整代码:

@OptIn(ExperimentalTextApi::class)
@Composable
fun MyCenterTextInCanvas() {
    val width: Dp = 200.dp
    val height: Dp = 40.dp
    val textMeasurer = rememberTextMeasurer()
    Canvas(
        modifier = Modifier
            .background(Color.LightGray)
            .requiredSize(width = width, height = height),
    ) {
        // 先测量文本的布局信息
        val textLayoutResult = textMeasurer.measure(text = "Sample Text")
        val textWidth = textLayoutResult.size.width
        val textHeight = textLayoutResult.size.height

        // 计算文本居中的偏移量:Canvas尺寸减去文本尺寸的一半
        val offsetX = (size.width - textWidth) / 2f
        val offsetY = (size.height - textHeight) / 2f

        drawText(
            textMeasurer = textMeasurer,
            text = "Sample Text",
            topLeft = Offset(x = offsetX, y = offsetY)
        )
    }
}

关键说明:

  • textMeasurer.measure() 方法可以获取文本的实际宽高(textLayoutResult.size),这是计算偏移的核心依据
  • 偏移量的计算逻辑:将文本左上角的位置调整为「Canvas尺寸的一半减去文本尺寸的一半」,这样文本的中心点就会和Canvas的中心点重合
  • 移除了多余的wrapContentSize修饰符,因为已经用requiredSize固定了Canvas尺寸,该修饰符不会影响Canvas内部的绘制逻辑

如果需要更精准的垂直基线对齐,可以结合textLayoutResult.lastBaseline调整垂直偏移,例如:

val baselineOffset = (size.height - textLayoutResult.lastBaseline) / 2f
drawText(
    textMeasurer = textMeasurer,
    text = "Sample Text",
    topLeft = Offset(x = offsetX, y = baselineOffset)
)

内容的提问来源于stack exchange,提问作者Abhimanyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:48:59