我尝试在Jetpack Compose中在圆形和正方形内绘制文本时遇到了这个问题。文本容器/容器(我不确定我们称之为什么),即浅红色矩形,它容纳实际文本的位置未居中。
我按照this答案进行操作,确保将文本精确地绘制在圆形的中心,但似乎仍不在圆形的中心位置。如我们所见,文本位于那个浅红色矩形的较低部分。
正如我们在这张图片中看到的那样,文本已经接触到圆形下部,而我们在上面有足够的空间。
如果我将字体缩小(在上面的代码中约为176sp),它看起来像下面这样。这表明浅红色矩形在圆内完美居中,而不仅仅是它所包含的文本。
我按照this答案进行操作,确保将文本精确地绘制在圆形的中心,但似乎仍不在圆形的中心位置。如我们所见,文本位于那个浅红色矩形的较低部分。
正如我们在这张图片中看到的那样,文本已经接触到圆形下部,而我们在上面有足够的空间。
![](https://istack.dev59.com/u6Ng4.webp)
这与基线有关吗?如何解决?
还是这是一个错误?
代码:
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Green.copy(alpha = 0.2f))
.padding(36.dp),
contentAlignment = Alignment.Center
) {
val textMeasurer = rememberTextMeasurer()
val textToDraw = "O"
val style = TextStyle(
fontSize = 328.sp,
background = Color.Red.copy(alpha = 0.2f)
)
val textLayoutResult = remember(textToDraw, style) {
textMeasurer.measure(textToDraw, style)
}
Canvas(modifier = Modifier.fillMaxSize()) {
drawCircle(
center = Offset(
x = center.x,
y = center.y
),
radius = 350f,
color = Color.Blue,
style = Stroke(
width = 8f
)
)
drawText(
textMeasurer = textMeasurer,
text = textToDraw,
style = style,
topLeft = Offset(
x = center.x - textLayoutResult.size.width / 2,
y = center.y - textLayoutResult.size.height / 2
)
)
drawPoints(
points = listOf(Offset(center.x, center.y)),
pointMode = PointMode.Points,
cap = StrokeCap.Round,
color = Color.Red,
strokeWidth = 25f
)
}
}
如果我将字体缩小(在上面的代码中约为176sp),它看起来像下面这样。这表明浅红色矩形在圆内完美居中,而不仅仅是它所包含的文本。
![](https://istack.dev59.com/LcQXf.webp)
非常感谢您的帮助和建议。
includeFontPadding
可以解决问题,正如你所提到的,特定字体相关的因素也会影响偏移。我尝试了在TextStyle
中使用baselineShift
,这有助于微调偏移。致敬。更多学习资源:这个和这个。 - skaflebaselineShift
来完成,知道这点很好。 - Thracian